

Bashでのループ処理は、下記のように `do` と `done` で挟むと思うのですが、

[code]

    #!/bin/bash
    for f in ./*
    do
        echo $f
    done
    
[/code]

試しに、`{}` で囲んでも意図通りに動きました。

[code]

    #!/bin/bash
    
    for f in ./*
    {
        echo $f
    }
    
[/code]

**実行結果:**

[code]

    $ ./scripts2.sh 
    ./scripts.sh
    ./scripts2.sh
    
[/code]

`{}` で囲んでも動いた理由がよくわからなかったのですが、こちらのコードが動く理由について教えていただけないでしょうか？


CC BY-SA 4.0
2022-09-12T22:02:13.317
91066
2022-09-13T00:57:25.337
2022-09-13T00:57:25.337
3060
4260
question
bash
bashでのループ処理は波括弧で囲んでも動く？


実装経緯までは分かりませんでしたが、たしかに Bash の実装を見る限り `for` に限ってこの構文が許されていました:
<https://git.savannah.gnu.org/cgit/bash.git/tree/parse.y?id=9439ce094c9aa7557a9d53ac7b412a23aa66e36b#n805>

[code]

    for_command:    FOR WORD newline_list DO compound_list DONE
                {
                  $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
                  if (word_top > 0) word_top--;
                }
        |   FOR WORD newline_list '{' compound_list '}'
                {
                  $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
                  if (word_top > 0) word_top--;
                }
    （以下省略）
    
[/code]

私の知る限り、この構文はドキュメントされていません。たとえば Bash のマニュアルには <https://www.gnu.org/savannah-
checkouts/gnu/bash/manual/bash.html#Looping-Constructs> に `for` の説明がありますが `do
... done` 形式の構文のみが書かれています。

英語版 Stack Overflow にもこの構文についての質問があり、この回答を書いている時点で存在する回答ではドキュメントは見つかっていませんでした:
<https://stackoverflow.com/q/22619510/5989200>


CC BY-SA 4.0
2022-09-12T23:21:08.850
91068
2022-09-12T23:21:08.850
19110
91066
answer