Ekspresi:
$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4
berfungsi dengan benar.
Saya gagal menemukan deskripsi sintaks ini yang {...;}
menggantikan ; do ...; done
dalam manual.
Apakah ada referensi dalam manual? Kerang mana yang bekerja dengan benar?
Jawaban:
{ ...; }
sudah diterima di tempatdo ...; done
dalamfor
loop dalam versi pertama dari shell Bourne di Unix V7 pada akhir 70-an (lihat kode sumber ) meskipun tidak pernah didokumentasikan sejauh yang saya tahu.Semua
ksh
(baik yang asli berasal dari shell Bourne, dan penulisan ulang ksh93),pdksh
¹ (dan turunannya),bash
(sejak awal tahun 1989) danzsh
mendukungnya. Saya tidak tahu adanyaash
turunan apa pun.yash
tidak salah tetapiyash
ditulis dengan standar POSIX.Dalam
zsh
, dukungan ditambahkan dengan 2.0 pada tahun 1991, tetapi sebagai bagian dari rangkaian baru formulir pendek untuk sebagian besar konstruksi yang melampaui sintaks Bourne. Bukan sajafor i in 1 2; { ...; }
, itufor i in 1 2; any-command
(dan varian-varian darinya). Dan itu didokumentasikan di sana dan telah sejak diperkenalkan .AFAIK, di samping
zsh
, hanya dokumen pdksh (untuk keduanyafor
danselect
).Adapun
((init; condition; action))
formulir, yang berasal dariksh93
dan disalin olehzsh
danbash
.Baik itu
((...))
maupun{ ...; }
di tempatdo ...; done
adalah POSIX.Lihat juga Apa tujuan kata kunci "lakukan" di Bash untuk loop? untuk lebih banyak
for
bentuk loop.¹ bukan versi sebelumnya, atau shell Forsyth yang menjadi dasarnya. Itu ditambahkan dalam 5.1.1 pada tahun 1994 dan itu mungkin menjelaskan mengapa itu didokumentasikan di sana
sumber