Czy dla ((…)) {…;} poprawna składnia powłoki? W jakich muszlach?

21

Wyrażenie:

$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4

działa poprawnie.

Nie mogę znaleźć opisu tej składni, w której {...;}zastępuje ; do ...; doneona instrukcję.

Czy jest odniesienie w instrukcji? Dla których powłok to działa poprawnie?

Izaak
źródło

Odpowiedzi:

30

{ ...; }został już zaakceptowany zamiast do ...; donew forpętlach w pierwszej wersji powłoki Bourne'a w Unixie V7 pod koniec lat 70. (patrz kod źródłowy ), chociaż nigdy nie udokumentowano o ile wiem.

Wszystkie ksh(zarówno oryginalne, pochodzące z powłoki Bourne'a, jak i przepisane przez ksh93), pdksh¹ (i pochodne) bash(od początku w 1989 r.) I zshobsługują to. Nie znam żadnej ashtakiej pochodnej. yashteż nie, ale yashzostał napisany do standardu POSIX.

W zsh1991 r. Dodano obsługę wersji 2.0 w wersji 2.0, ale jako część nowej gamy krótkich form dla większości konstrukcji, która wykracza poza składnię Bourne'a. To nie tylko for i in 1 2; { ...; }, to for i in 1 2; any-command(i jego warianty). I jest tam udokumentowane i było od jego wprowadzenia .

AFAIK oprócz tego zshdokumentuje tylko pdksh (zarówno dla, jak fori dla select).

Jeśli chodzi o ((init; condition; action))formularz, który pochodzi ksh93i został skopiowany przez zshi bash.

Ani to, ((...))ani { ...; }miejsce zamiast do ...; donePOSIX.

Zobacz także Jaki jest cel słowa kluczowego „do” w Bash dla pętli? więcej forform pętli.


¹ nie wcześniejsze wersje ani powłoka Forsyth, na której jest oparta. Został dodany w 5.1.1 w 1994 roku i prawdopodobnie wyjaśnia, dlaczego został tam udokumentowany

Stéphane Chazelas
źródło
1
Wow, pan Bourne w pełni przyjął zastosowanie preprocesora c w kodzie źródłowym z lat 70.
Cyfrowa trauma