2017-11-19 3 views
0

Ich versuche, die Bash-Syntax zu lernen. Während die Dokumentation, die ich lese, bestätigt, erwarte ich, dass ARRAYNAME [0] auf Element 1 und ARRAYNAME [1] zugreift, um auf Element 2 zuzugreifen. Es scheint jedoch etwas Lustiges mit meinem Skript zu geschehen. Der Versuch, auf ARRAYNAME [0] zuzugreifen, scheint mir eine leere Zeichenfolge zu geben, da ich die Ausgabe in den Kommentaren unten zeige.
Das folgende Skript ist, was ich bearbeitet habe, um die Ausgabe so zu drucken, wie ich es erwarte. Ich glaube nicht, dass meine Probleme von der Ausführung von zsh kommen, da ich versucht habe, dieses Skript mit /bin/sh auszuführen. Was sehe ich hier nicht?
Vielen Dank im Voraus.Array-Elemente verhalten sich unerwartet

Test.sh:

#!/bin/zsh 
NAMES=(Homer Marge Bart Lisa Maggy) 
OUTPUTSTRING="The Simpsons family consists of: " 
FAMILY="This list is empty :(" 
echo "Names[0]: ${NAMES[0]}"   # prints "Names[0]: " 
echo "Names[1]: ${NAMES[1]}"   # prints "Names[1]: Homer" 
if [ ${#NAMES[@]} -gt 0 ] ; then 
    FAMILY="${NAMES[1]}" 
else         # does not go in to else 
    echo "$OUTPUTSTRING""$FAMILY" 
    exit 0 
fi 
NAMECOUNTER=2 
while [ $NAMECOUNTER -le ${#NAMES[@]} ]; do  #-lt if behaviour was as I expected 
    FAMILY+=", ${NAMES[$NAMECOUNTER]}" 
    NAMECOUNTER=$((NAMECOUNTER+1)) 
done 

echo "The Simpsons family consists of: $FAMILY" # The Simpsons family consists of: Homer, Marge, Bart, Lisa, Maggy 
+0

Warum sollten Sie die korrekten Ergebnisse eines Bash-Skripts erwarten, wenn Sie in einer anderen Shell ausgeführt werden? Während zsh und bash einige Ähnlichkeiten aufweisen, sind sie nicht genau gleich. Was passiert also, wenn Sie/bin/bash für dasselbe Skript verwenden? – grail

+0

'bash'-Arrays sind nullindiziert. 'zsh' Arrays sind jedoch 1-indiziert, und Sie führen das Skript mit' zsh' aus. '/ bin/sh' unterstützt in der Regel keine Arrays, obwohl' bash' anscheinend auch dann zu tun scheint, wenn '/ bin/sh' aufgerufen wird. – chepner

+0

zsh ist meine Standard-Shell für Erweiterungen und ästhetische Gründe. Es macht mir nichts aus, auf Konsistenz zwischen zsh und bash zu testen, wenn ich erschöpft habe, ob meine Logik das Problem ist. Die Verwendung von/bin/bash für dasselbe Skript liefert die gleichen Ergebnisse. –

Antwort

2

Du Ausführen eines bash Skript (die Arrays von 0 beginnend indiziert werden erwartet) mit zsh (die Indizes Arrays ausgehend von 1). Ändern Sie den shebang zu

#!/bin/bash 

(oder was auch immer Pfad korrekt ist), um sicherzustellen, Ihr Skript von bash ausgeführt wird, wenn Sie das Skript als eine ausführbare Datei ausführen. Alternativ können Sie auch explizit myscript mit bash unter Verwendung von bash myscript anstelle von z. B. ./myscript ausführen.

Verwandte Themen