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