Bash の $@ と $* の挙動の違い

ググりづらい Bash の記号に関するネタ。

Bash 関数の中で、全ての引数を取得できる2つの記号がある。

この2つの挙動が異なるので紹介する。

目次

$@ : ドル・アットマーク

$@ は、"$@" とダブルクォートで囲んだ時に、クォートが残らずに変数展開される。

function grep_wrapper() {
  grep -- "$@" /PATH/TO/FILE.txt
}

この関数を

と実行すると、

と解釈される。

つまりクォーテーションが残らないので、

というように複数単語を繋げたい場合は、

と書かないといけない。

$* : ドル・アスタリスク

$*"$*" とダブルクォートで囲んだ時に、クォートが残って変数展開される。

function grep_wrapper() {
  grep -- "$*" /PATH/TO/FILE.txt
}

と実行すると、

と解釈される。

この挙動は set -x すると実際に確認できる。

function grep_wrapper() {
  set -x
  grep -- "$*" /PATH/TO/FILE.txt
  set +x
}

用途にもよると思うが、"$*" (ドル・アスタリスクをダブルクォートで囲む) という書き方の方が、意図したとおりに使えることもあると思うので、違いを押さえておいて使い分けよう。