Экспрессия:
$ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}'
0
1
2
3
4
работает правильно.
Я не могу найти описание этого синтаксиса, в котором {...;}
он заменяет, ; do ...; done
в руководстве.
Есть ли ссылка в руководстве? Для каких оболочек это работает правильно?
Ответы:
{ ...; }
был уже принят на местеdo ...; done
вfor
петлях в первой версии Bourne оболочки в Unix V7 в конце 70 - х годов (см исходный код ) , хотя никогда не документирована, насколько я знаю.Все
ksh
(как исходный, полученный из оболочки Борна, так и с перезаписью ksh93),pdksh
¹ (и производные),bash
(с начала в 1989 году) иzsh
поддерживают его. Я не знаю ни однойash
производной, которая делает.yash
тоже нет, ноyash
написано в стандарте POSIX.В
zsh
1991 году поддержка была добавлена с 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 году, и это, вероятно, объясняет, почему он там был задокументирован
источник