配列のパラメータ展開

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.