web-dev-qa-db-ja.com

for((...)){...;}は有効なシェル構文ですか?どの殻に?

式:

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

正常に動作します。

マニュアルで{...;}; do ...; doneを置き換えているこの構文の説明が見つかりません。

マニュアルに参考資料はありますか?どのシェルでそれが正しく機能しますか?

21
Isaac

{ ...; }は、70年代後半のUnix V7のBourne Shellの最初のバージョンのforループでdo ...; doneの代わりにすでに受け入れられていました( ソースコード)を参照 =)しかし、私の知る限りでは文書化されていません。

すべてのksh(Bourne Shellから派生した元の1つとksh93の書き換えの両方)、pdksh¹(および派生物)、bash(1989年の初めから)およびzshサポートします。どんなash派生物も知りません。 yashもそうではありませんが、yashはPOSIX標準に書かれています。

zshでは、1991年に2.0でサポートが追加されましたが、Bourne構文を超えるほとんどの構成の新しい短い形式の一部としてサポートされています。 for i in 1 2; { ...; }だけでなく、for i in 1 2; any-command(およびそのバリエーション)でもあります。そして、それは thereその導入以来ずっと と文書化されています。

AFAIKは、zshのほかに、pdkshのみがそれを文書化します(forselectの両方)。

((init; condition; action))フォームについては、ksh93から取得され、zshおよびbashによってコピーされました。

((...))の代わりに{ ...; }do ...; doneもPOSIXではありません。

forループ形式の詳細については、 Bash forループの「do」キーワードの目的は何ですか? も参照してください。


earlier以前のバージョンや、それが基づいているForsythシェルではありません。それは1994年の5.1.1で追加され、おそらくそれがそこで文書化された理由を説明しています

30