Zauważ, że ta składnia jest dziedziczona z powłoki Bourne'a.
Po nazwie zmiennej możesz mieć albo in
jawnie podaną listę elementów, albo do
zapętlić parametry pozycyjne.
for i in 1 2 3
do
echo "$i"
done
Lub
set 1 2 3
for i do
echo "$i"
done
Posiadanie do
w obu przypadkach (nawet jeśli nie jest to absolutnie konieczne w pierwszym), zapewnia bardziej spójną składnię. Jest również zgodny z pętlami while
/, w until
których do
jest to konieczne.
while
cmd1
cmd2
do
cmd3
cmd4
done
Musisz do
powiedzieć, gdzie kończy się lista poleceń warunkowych .
Pamiętaj, że powłoka Bourne'a nie była obsługiwana for i; do
. Ta składnia nie była również POSIX do czasu wydania standardu 2016 ( for i do
zawsze był POSIX; patrz powiązany błąd grupy Austin ).
zsh
ma kilka krótszych form, takich jak:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Lub wsparcie dla więcej niż jednej zmiennej:
for i j (1 a 2 b) echo $i $j
(chociaż nie można użyć in
lub do
jako nazwy zmiennej zamiast j
powyższego).
Nawet jeśli jest to rzadko udokumentowane, większość powłok podobnych do Bourne'a (Bourne, ksh, bash, zsh, not ash
nor yash
) również obsługuje:
for i in 1 2 3; { echo "$i";}
Powłoka Bourne'a ( ksh
i zsh
nie bash
) obsługuje również:
for i { echo "$i"; }
Chociaż bash
, ksh
i zsh
(ale nie Bourne shell) support:
for i; { echo "$i"; }
Wszystkie (Bourne, bash
, ksh
, zsh
) wsparcie:
for i
{ echo "$i";}
ksh93
, bash
, zsh
Support:
for ((i=1;i<=3;i++)) { echo "$i"; }
for
; polecenie może zostać zakończone znakiem nowej linii lub średnikiem. Ma to nieco więcej sensu dlaif
/while
(poprzedni zthen
raczej niżdo
), ale w zasadzie mogliby go pominąć i potrzebować podpowłoki lub nawiasów klamrowych do (rzadkiego) używania wielu poleceń. Podejrzewam, że prawdziwym powodem, dla którego robi to powłoka Bourne'a, jest to, że robi to ALGOL, i powinniśmy się cieszyć, żedone
nie jest to napisaneod
.od
był już używany jako nazwa programu Octal Dump.for i do
jest Bourne i POSIX, ale nie będzie działać w niektórych starych wersjach powłok opartych na popiele IIRC.for i in "$@"
nie będzie działać w powłoce Bourne'a, jeśli$IFS
nie zawiera znaku spacji.for i<newline>do
jest rzeczywiście najbardziej przenośny, jeśli chcesz wziąć pod uwagę bardzo stare systemy BSD. Szczegółowe informacje można znaleźć na stronie inulm.de/~mascheck/various/bourne_args