私は命令を読んだ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
改行文字です。最後のものはあなたです。;
linebreak
do_group
do ...; done
これは、有効なfor
ループが次のようになることを意味します。
サイクル
"$@"
:for name do ...; done
サイクル
"$@"
:for name; do ...; done
空のリストを繰り返します。
for name in; do ...; done
空でないリストを繰り返します。
for name in word-list; do ...; done
3番目の形式は機能しますが、何もしません。単語リストを空のループに拡張できるようにするために存在します。