Perhatikan bahwa sintaksis diwarisi dari shell Bourne.
Setelah nama variabel, Anda dapat memiliki in
daftar elemen yang diberikan secara eksplisit, atau do
, untuk mengulang parameter posisi.
for i in 1 2 3
do
echo "$i"
done
Atau
set 1 2 3
for i do
echo "$i"
done
Memiliki do
dalam kedua kasus (bahkan jika itu tidak sepenuhnya diperlukan dalam yang pertama) membuat sintaks yang lebih konsisten. Ini juga konsisten dengan while
/ until
loop di mana do
diperlukan.
while
cmd1
cmd2
do
cmd3
cmd4
done
Anda perlu do
mengetahui di mana daftar perintah kondisi berakhir.
Perhatikan bahwa shell Bourne tidak mendukung for i; do
. Sintaks itu juga tidak POSIX sampai edisi 2016 standar ( for i do
selalu POSIX; lihat bug grup Austin terkait ).
zsh
memiliki beberapa bentuk steno seperti:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Atau dukungan untuk lebih dari satu variabel:
for i j (1 a 2 b) echo $i $j
(meskipun Anda tidak dapat menggunakan in
atau do
sebagai nama variabel di tempat di j
atas).
Meskipun jarang didokumentasikan, sebagian besar shell mirip Bourne (Bourne, ksh, bash, zsh, tidak ash
juga yash
) juga mendukung:
for i in 1 2 3; { echo "$i";}
Shell Bourne, ksh
dan zsh
(tetapi tidak bash
) juga mendukung:
for i { echo "$i"; }
Sementara bash
, ksh
dan zsh
(tetapi bukan shell Bourne) mendukung:
for i; { echo "$i"; }
Semua (Bourne, bash
, ksh
, zsh
) dukungan:
for i
{ echo "$i";}
ksh93
, bash
, zsh
Dukungan:
for ((i=1;i<=3;i++)) { echo "$i"; }
for
; perintah dapat diakhiri oleh baris baru atau titik koma. Itu membuat sedikit lebih masuk akal untukif
/while
(yang pertama denganthen
daripadado
), tetapi pada prinsipnya itu bisa dihilangkan dan membutuhkan subkulit atau kawat gigi untuk penggunaan (jarang) perintah ganda. Saya curiga alasan sebenarnya mengapa shell Bourne melakukannya adalah karena ALGOL melakukannya, dan kita harus senang bahwadone
tidak diejaod
.od
sudah digunakan sebagai nama program Octal Dump.for i do
adalah Bourne dan POSIX, tetapi tidak akan berfungsi di beberapa versi lama shell berbasis abu IIRC.for i in "$@"
tidak akan berfungsi di shell Bourne jika$IFS
tidak mengandung karakter spasi.for i<newline>do
memang yang paling portabel jika Anda perlu mempertimbangkan sistem BSD yang sangat tua. Lihat in-ulm.de/~mascheck/various/bourne_args untuk detailnya