bashでprintfを使用して@で配列を印刷すると、最初の要素だけが印刷されるのはなぜですか?

bashでprintfを使用して@で配列を印刷すると、最初の要素だけが印刷されるのはなぜですか?

配列があります

snapshots=(1 2 3 4)

私が走るとき

printf "${snapshots[*]}\n"

期待どおりに印刷されます

1 2 3 4

しかし、私が走るとき

printf "${snapshots[@]}\n"

ただ印刷される

1

改行文字がありません。私の理解は、配列にアクセスすると@配列を拡張し、各要素が改行になるようにする必要がありますが、そうしないようprintfですecho。なぜこれですか?

答え1

printf最初の引数を型文字列として解釈し、それを印刷します。他の引数は、書式文字列に必要な場合にのみ使用されます。

の場合、printf "${snapshots[*]}\n"最初の引数は配列の要素であり、最初の$IFS文字(デフォルトは空白)に関連付けられ、その後にバックスラッシュとn:が続きます"1 2 3 4\n"。配列内のすべての値をスペースで区切ってから、改行文字を印刷します。

の場合、printf "${snapshots[@]}\n"最初の引数は配列の最初の項目であり、配列"1"の残りの部分は使用する書式文字列に別々の引数として提供されます。最後のパラメータが\n追加されました:"2" "3" "4\n"。フォーマット文字列は他のパラメータを参照しないため、すべて無視されます。すべての出力は最初の値であり、後続の改行はありません。

を使用するときにすべての値を表示するには、実際の書式@文字列を指定する必要があります。

printf "%s\n" "${snapshots[@]}"

パラメータ参照を含む書式文字列は、すべてのパラメータを使用するために必要なだけ繰り返されます。したがって、単一の参照で配列のすべての値を印刷するのに十分です。ここで、各値の後には改行文字が続きます。

関連情報