forループがループ変数の値のセットを明示的に指定する必要がないのはなぜですか? [コピー]

forループがループ変数の値のセットを明示的に指定する必要がないのはなぜですか? [コピー]

私は命令を読んだhttps://unix.stackexchange.com/a/175845/674

なぜそれができますか?

$ bash -c 'for f do echo "$f";done' bash a b c
a
b
c

に出力

$ bash -c 'for f in "$@"; do echo "$f";done' bash a b c
a
b
c

forループを明示的に指定する必要がない理由

  • in "$@"などのループ変数の値のセット

  • ;

ありがとうございます。

答え1

~からバッシュのマニュアルページ:

名前[[in[単語...]];]実行するタスクのリスト。

次の単語のリストが展開され、アイテムのリストが生成されます。リストの各要素に変数名が順番に設定され、毎回リストが実行されます。in単語を省略すると、forコマンドは各位置パラメータセットに対してリストを1回ずつ実行します。(以下のパラメータを参照)...

次に、パラメータセクションで次の操作を行います。

位置パラメータは、単一の数値ゼロではなく1つ以上の数値で表されるパラメータです。位置パラメータは、シェルが呼び出されるとシェルのパラメータから割り当てられます。、set組み込みコマンドを使用して再割り当てできます。 ...

つまり、inキーワードと次のセミコロンはオプションです。キーワードを省略すると、inループの引数はforシェルに渡された引数から取得されます。したがって、提供した2つのコード例は同じです。

答え2

POSIX構文のため許す

forループの形式は次のとおりです。

for name [ in [word ... ]]
do
    compound-list
done

まず、次の単語リストを展開して項目リストを生成する必要があります。次に、各項目の変数名を順番に設定し、毎回複合リストを実行します。拡張によって項目が生成されない場合は、複合リストを実行しないでください。省略:

in word...

次のようにする必要があります。

in "$@"

ループの形式的な構文forは次のとおりです。

for_clause       : For name                                      do_group
                 | For name                       sequential_sep do_group
                 | For name linebreak in          sequential_sep do_group
                 | For name linebreak in wordlist sequential_sep do_group

For文字列の構文表示ですfor。 1 つ以上の改行文字で、単一のオプションのsequential_sep改行文字です。最後のものはあなたです。;linebreakdo_groupdo ...; done

これは、有効なforループが次のようになることを意味します。

  1. サイクル"$@":

    for name do ...; done
    
  2. サイクル"$@":

    for name; do ...; done
    
  3. 空のリストを繰り返します。

    for name in; do ...; done
    
  4. 空でないリストを繰り返します。

    for name in word-list; do ...; done
    

3番目の形式は機能しますが、何もしません。単語リストを空のループに拡張できるようにするために存在します。

関連情報