シェルスクリプトの特殊変数$@と$*の違い

$@と$*は共に「全ての引数」を表す特殊変数ですが、ダブルクォートなどで括った際の扱いが異なります。

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つとなります。