{...; }
уже был принят вместо do...; done
в циклах for
в первой версии оболочки Bourne в Unix V7 в конце 70-х (см. исходный код ), хотя никогда не документировался до сих пор насколько я знаю.
Всеksh
(как исходные, полученные из оболочки Борна, так и переписанные ksh93 ), pdksh
¹ (и производные ),bash
(с самого начала в 1989 г. )и zsh
поддерживают его. Я не знаю ни одной ash
производной, которая это делает. yash
тоже нет, но yash
был написан в соответствии со стандартом POSIX.
В zsh
поддержка была добавлена в версии 2.0 в 1991 году, но как часть нового диапазона кратких форм для большинства конструкций, выходящих за рамки синтаксиса Борна. Это не только 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 в циклах for в Bash? для получения дополнительных for
форм цикла.
¹ ни более ранние версии, ни оболочка Forsyth, на которой она основана. Он был добавлен в 5.1.1 в 1994 году, и это, вероятно, объясняет, почему он был там задокументирован
.