Corredor

ウェブ、プログラミングの勉強メモ。

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

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

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

  • $@ : ドル・アットマーク
  • $* : ドル・アスタリスク

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

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

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

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

この関数を

  • $ grep_wrapper aaa bbb

と実行すると、

  • grep aaa bbb

と解釈される。

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

  • $ grep 'aaa bbb'

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

  • $ grep_wrapper 'aaa bbb'

と書かないといけない。

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

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

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

と実行すると、

  • grep 'aaa bbb'

と解釈される。

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

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

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

入門bash 第3版

入門bash 第3版