Apakah untuk ((...)) {...;} sintaksis shell yang valid? Di mana cangkang?

21

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 ...; donedalam manual.

Apakah ada referensi dalam manual? Kerang mana yang bekerja dengan benar?

Ishak
sumber

Jawaban:

30

{ ...; }sudah diterima di tempat do ...; donedalam forloop 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) dan zshmendukungnya. Saya tidak tahu adanya ashturunan apa pun. yashtidak salah tetapi yashditulis 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 saja for i in 1 2; { ...; }, itu for 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 keduanya fordan select).

Adapun ((init; condition; action))formulir, yang berasal dari ksh93dan disalin oleh zshdan bash.

Baik itu ((...))maupun { ...; }di tempat do ...; doneadalah POSIX.

Lihat juga Apa tujuan kata kunci "lakukan" di Bash untuk loop? untuk lebih banyak forbentuk 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

Stéphane Chazelas
sumber
1
Wow, Tuan Bourne sepenuhnya menganut penggunaan preprosesor c dalam kode sumber tahun 70-an.
Digital Trauma