Обратите внимание, что этот синтаксис унаследован от оболочки Bourne.
После имени переменной у вас может быть либо inявно заданный список элементов, либо doцикл по позиционным параметрам.
for i in 1 2 3
do
echo "$i"
done
Или же
set 1 2 3
for i do
echo "$i"
done
Наличие doв обоих случаях (даже если в первом случае это не является строго обязательным) обеспечивает более согласованный синтаксис. Это также согласуется с циклами while/, untilгде doэто необходимо.
while
cmd1
cmd2
do
cmd3
cmd4
done
Вам нужно doсказать, где заканчивается список команд условия .
Обратите внимание, что оболочка Bourne не поддерживается for i; do. Этот синтаксис также не использовался в POSIX до выпуска стандарта 2016 года ( for i doвсегда был POSIX; см. Соответствующую ошибку группы в Остине ).
zsh имеет несколько сокращенных форм, таких как:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Или поддержка более чем одной переменной:
for i j (1 a 2 b) echo $i $j
(хотя вы не можете использовать inили doкак имя переменной вместо jвыше).
Даже если это редко документировано, большинство Bourne-подобных оболочек (Bourne, ksh, bash, zsh, not ashили yash) также поддерживают:
for i in 1 2 3; { echo "$i";}
Оболочка Bourne kshи zsh(но не bash) также поддерживают:
for i { echo "$i"; }
Хотя bash, kshи zsh(но не Bourne оболочки) поддержка:
for i; { echo "$i"; }
Все (Bourne, bash, ksh, zsh) поддержка:
for i
{ echo "$i";}
ksh93, bash, zshПоддержка:
for ((i=1;i<=3;i++)) { echo "$i"; }