it-swarm.com.de

Was ist der Zweck des Schlüsselworts "do" in Bash for-Schleifen?

Was ist der Zweck des Schlüsselworts do in der Bash for -Schleifensyntax? Für mich fühlt es sich überflüssig an.

for i in `seq 1 2`; do echo "hi"; done

Warum ist die Syntax nicht so?

for i in `seq 1 2`; echo "hi"; done

Ich bin sicher, dass es tut einen Zweck erfüllt. Ich will nur lernen.

77

Beachten Sie, dass diese Syntax von der Bourne-Shell geerbt wird.

Nach dem Variablennamen können Sie entweder in haben, um die Liste der Elemente explizit anzugeben, oder do, um die Positionsparameter zu durchlaufen.

for i in 1 2 3
do
  echo "$i"
done

Oder

set 1 2 3
for i do
  echo "$i"
done

Das Vorhandensein von do in beiden Fällen (auch wenn dies im ersten Fall nicht unbedingt erforderlich ist) sorgt für eine konsistentere Syntax. Es stimmt auch mit den Schleifen while/until überein, in denen do erforderlich ist.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

Sie benötigen das do, um festzustellen, wo die Liste der Bedingungsbefehle endet.

Beachten Sie, dass die Bourne Shell for i; do Nicht unterstützt. Diese Syntax war auch nicht POSIX bis zur Ausgabe 2016 des Standards (for i do War immer POSIX; siehe der zugehörige Austin-Gruppenfehler ).

zsh hat einige Kurzformen wie:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

Oder Unterstützung für mehr als eine Variable:

for i j (1 a 2 b) echo $i $j

(obwohl Sie in oder do nicht als Variablennamen anstelle von j oben verwenden können).

Auch wenn dies selten dokumentiert ist, unterstützen die meisten Bourne-ähnlichen Muscheln (Bourne, ksh, bash, zsh, nicht ash oder yash) auch:

for i in 1 2 3; { echo "$i";}

Die Bourne Shell, ksh und zsh (aber nicht bash) unterstützen auch:

for i { echo "$i"; }

Während bash, ksh und zsh (aber nicht die Bourne Shell) Folgendes unterstützen:

for i; { echo "$i"; }

Alle (Bourne, bash, ksh, zsh) unterstützen:

for i
{ echo "$i";}

ksh93, bash, zsh Unterstützung:

for ((i=1;i<=3;i++)) { echo "$i"; }
118