Чи для ((...)) {…;} дійсний синтаксис оболонки? У яких оболонках?


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.

В zsh, була додана підтримка з 2,0 в 1991 році, але в рамках нової серії коротких форм для більшості конструкцій , які виходять за рамки синтаксису Bourne. Це не тільки 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.

Дивіться також Яке призначення ключового слова "робити" в Bash для циклів? для більшої кількості forциклів.


¹ не більш ранні версії, ні оболонка Форсайта, на якій вона заснована. Він був доданий в 5.1.1 в 1994 році, і це, ймовірно, пояснює, чому це стало документально підтверджено


1
Нічого собі, містер Борн повністю прийняв використання препроцесора c у вихідному коді 70-х років.
Цифрова травма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.