Ich habe festgestellt, dass es in zsh zwei alternative Möglichkeiten zum Erstellen von Schleifen gibt :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Beide drucken:
1
2
3
Meine Frage ist, warum die beiden Syntaxen? Ist $x
Iterieren durch eine andere Art von Objekt in jedem von ihnen?
Macht bash einen ähnlichen Unterschied?
Nachtrag:
Warum funktioniert folgendes ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
aber dieser nicht ?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
# It complains with "parse error near `$d'"
for x $d; do print $x;done
for x ($d); do print $x; done
wird funktionieren, und es wird mit der ersten Syntax übereinstimmen, die Sie am Anfang Ihrer Frage aufgezählt haben.for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"
={0,2,4}x{a,b,c}
. Semikolons gelten für die äußerste Schleife und Umleitungen gelten für die innerste Schleife. Wenn Sie dies ändern müssen, benötigen Sie nur geschweifte Klammern:for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
={1,...,9}*({0,2,4}x{a,b,c})
. Natürlich können Sie Schleifen mit zsh-Erweiterung kombinieren:for i ("("{0..4..2}","{a..c}")") echo $i
Antworten:
Verschiedene Formen komplexer Befehle wie Schleifen haben in zsh alternative Formen . Diese Formen sind größtenteils von der C-Schale inspiriert , die in jungen Jahren ziemlich verbreitet war, jetzt aber verschwunden ist. Diese alternativen Formen verhalten sich genauso wie die normalen Formen, sie haben nur eine andere Syntax. Sie sind etwas kürzer, aber weniger klar.
Das Standardformular für den
for
Befehl lautetfor x in 1 2 3; do echo $x; done
und das Standardformular für denwhile
Befehl lautetwhile test …; do somecommand; done
. KSH, bash und zsh haben eine alternative Form vonfor
:for ((i = 0; i < 42; i++)); do somecommand; done
, die die nachahmtfor
Schlingen Sprachen wie Pascal oder C, auf ganze Zahlen aufzuzählen. Andere exotische Formen, die in zsh vorkommen, sind spezifisch für zsh (aber oft von csh inspiriert).quelle
zsh
? Außerdem habe ich am Ende meines OP ein Beispiel hinzugefügt, in dem ich nicht herausfinden kann, wie ich zwischen den Syntaxen übersetzen soll. Wenn der Unterschied nur in der Syntax besteht, wie soll ich das zweite Skript im Addendum korrigieren, damit es funktioniert?for x $d
und zsh erwartet, dass entwederin
oder(
wo Sie geschrieben haben$d
. Satzzeichen und reservierte Wörter können nicht aus einer Variablenerweiterung stammen. Sie müssen analysiert werden, bevor die Shell mit den Variablenerweiterungen beginnen kann.for (( … ))
Formular und belegt viel Speicher, wenn 3 groß ist.do
after));
. Zsh akzeptiert auch eine andere Syntax,for ((…)); COMMAND
bei derCOMMAND
es sich um einen einzelnen Befehl handelt. Deshalb akzeptiert esfor ((i = 1; i<100; i++)); ghi show $i | grep "log"
. Wenn es danach siehtdone
, beschwert es sich, weil es keindo
Ende gab. Siehe „Alternative Formulare für komplexe Befehle“ im Handbuch .