Является ли for ((…)) {…;} допустимым синтаксисом оболочки? В каких снарядах?

21

Экспрессия:

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

работает правильно.

Я не могу найти описание этого синтаксиса, в котором {...;}он заменяет, ; do ...; doneв руководстве.

Есть ли ссылка в руководстве? Для каких оболочек это работает правильно?

Исаак
источник

Ответы:

30

{ ...; }был уже принят на месте do ...; doneв forпетлях в первой версии Bourne оболочки в Unix V7 в конце 70 - х годов (см исходный код ) , хотя никогда не документирована, насколько я знаю.

Все ksh(как исходный, полученный из оболочки Борна, так и с перезаписью ksh93), pdksh¹ (и производные), bash(с начала в 1989 году) и zshподдерживают его. Я не знаю ни одной ashпроизводной, которая делает. yashтоже нет, но yashнаписано в стандарте POSIX.

В zsh1991 году поддержка была добавлена ​​с 2.0, но как часть новой серии кратких форм для большинства конструкций, которая выходит за рамки синтаксиса Борна. Это не только for i in 1 2; { ...; }, это for i in 1 2; any-command(и его варианты). И это задокументировано там и было с момента его введения .

AFAIK, кроме того zsh, только pdksh документирует это (для обоих forи select).

Что касается ((init; condition; action))формы, которая приходит ksh93и была скопирована zshи bash.

Ни то , ((...))ни { ...; }на месте do ...; doneне POSIX.

См. Также Какова цель ключевого слова do в Bash для циклов? для большего количества forформ петли.


¹ не более ранние версии, ни оболочка Forsyth, на которой он основан. Он был добавлен в 5.1.1 в 1994 году, и это, вероятно, объясняет, почему он там был задокументирован

Стефан Шазелас
источник
1
Ого, мистер Борн полностью согласился с использованием препроцессора c в исходном коде 70-х годов.
Цифровая травма