BashScriptでは、配列をパラメータ展開する方法が用意されています。ちなみに、よく混合しやすいのがパラメータ置換ですが、パラメータ置換とパラメータ展開は本質的に異なるものです。パラメータ置換はパラメータの値を置き換えることでパラメータ展開はパラメータの値を取り出すことです。
@
と *
はどちらも配列のすべての要素を取得する方法ですが重要な違いがあります。これは言葉で説明するよりも実際のコードを見たほうがわかりやすいでしょう。
#!/bin/bash set -- a b c for i in "$@" ; do echo "$i" done : <<EOF a b c EOF for i in "$*" ; do echo "$i" done echo : <<EOF a b c EOF
1つ目のforループでは各要素ごとに値を取り出しループ処理しています。一方で2つ目のforループではすべての要素を一つに結合しており実際にループは一回で終わります。
つまり、 *
を使うとすべての要素が結合されます。 @
を使うと個々の要素が分解されて展開されます。
*
を使った配列の展開ではIFSで要素を結合するときの文字列を指定できます。あまりないかもしれませんが、文字列を結合して出力するときのフォーマットとして使えるかもしれません。
#!/bin/bash set -- a b c OLD_IFS=IFS IFS=',' for i in "$*" ; do echo "$i" done echo : <<EOF a,b,c EOF IFS=OLD_IFS
Written with StackEdit.