bash配列値を参照するときの@と*の違いは何ですか?


15

このBashガイドには次のように書かれています。

インデックス番号が@または*の場合、配列のすべてのメンバーが参照されます。

私がこれを行うとき:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i "
done

与える:(example.1 example.2 example.3望ましい結果)。

しかし、を使用すると${LIST[*]}example.1 2 3代わりに取得します。

どうして?

編集:printfを使用すると、@と*は実際に同じ結果になります。


それは私のために働くようです。@と*の両方を試しましたが、どちらの場合も同じ結果が得られるようです。使用しているシェルは何ですか?echo $SHELL出力を実行して質問に貼り付けます。
ラメシュ

私の例は間違っていた、これは実際に発生するのはでありecho、ではなくprintf、私は気づいた。
アルジャン


他の質問はについてです@goldilocks $*$@。答えは似ており、1つの質問は他の質問のサブセットと考えることできますが、それらは異なる質問です。
ステファンシャゼル14年

回答:


17

違いはわずかです。「$ *」は1つの引数を作成し、「$ @」は個別の引数に展開されるため、次のようになります。

LIST=(1 2 3)
for i in "${LIST[@]}"; do
 echo "example.$i"
done

複数の変数としてリストを処理(印刷)します

だが

LIST=(1 2 3)
for i in "${LIST[*]}"; do
 echo "example.$i"
done

リストを1つの変数として扱います。


echoとの違いはどこprintfから来ているか知っていますか?であるためprintfためのループでは、*リストの参照は、複数の変数として扱われます。
アルジャン

何かを1つの変数と複数の変数として扱うとはどういう意味ですか?違いを説明するための実用的な例を提供できればと思います。
fraxture
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.