web-dev-qa-db-ja.com

bashの特別なパラメーター$ @はprintfでループとして扱われますか?

だから私は以下をテストしています:

foo() {  
  printf "\nAll the parameters, each on a separate line:\n"  
  printf "param: %s\n" "$@"  
}  

foo The "nicely colored" Rainbow  

出力は次のとおりです。

All the parameters:  
param: The
param: nicely colored
param: Rainbow

したがって、IFS\t\nに設定されているために正しく理解できれば、パラメーターはタブ(IFSの最初の文字)で区切られます。
しかし、なぜそれらは別々の行に印刷されるのですか?
各パラメーターに対してprintfが実行されますか。つまりbashはこれをforループに変換しますか?
また、以下(二重引用符なし)でも同じ結果が出力されます。

printf "param: %s\n" $@

4
Jim

ここで起こっていることは、(%sなど)の位置フォーマットパラメータよりもprintf多い引数を渡すと、フォーマットが繰り返されることです。また、フォーマット文字列に\nが含まれているため、複数行で繰り返されています。この場合、$@について特別なことは何もありません。

例えば:

$ printf 'Foo: %s\n' bar baz
Foo: bar
Foo: baz

$ printf 'Foo: %s %s\n' bar baz
Foo: bar baz
17
Patrick