$@と$*は共に「全ての引数」を表す特殊変数ですが、ダブルクォートなどで括った際の扱いが異なります。
test.sh
#!/bin/sh function outputarg() { echo "引数の数: "$# echo "第一引数: "$1 echo "第二引数: "$2 echo -e "\n" } echo "「\$@」の場合" outputarg "$@" echo "「\$*」の場合" outputarg "$*"
test.shのoutputargは「引数の数」、「第一引数」、「第一引数 第二引数」の順番に出力する関数です。
この関数に$@と$*をダブルクォートで括った状態で渡しています。
test.shにarg1、arg2の2つの引数を渡して実行すると以下のようになります。
$ ./test.sh arg1 arg2 「$@」の場合 引数の数: 2 第一引数: arg1 第二引数: arg2 「$*」の場合 引数の数: 1 第一引数: arg1 arg2 第二引数:
$@を利用した場合、引数1つ1つがダブルクォートで括られます。
よってoutputargの引数は”arg1″、”arg2″となり、引数の数は2つとなります。
一方、$*を利用した場合、引数全てがまとめてダブルクォートで括られます。
つまりoutputargの引数は”arg1 arg2″となり、引数の数は1つとなります。