$* や $@ はシェルスクリプトに渡されたすべての引数を表します。
$* と $@ の使い方
- 
$*: すべての引数を1つの単一の文字列として扱います。引数はスペースで区切られます。
- 
$@: すべての引数を個別の引数として扱います。引数はそれぞれ独立しており、特にダブルクォートで囲むと、空白を含む引数も正しく処理されます。
具体例と $* と $@ の違い
example.sh
#!/bin/bash
echo "\$* の出力: $*"
echo "\$@ の出力: $@"
引数を渡して上記のスクリプトを実行します。
$ bash ./example.sh "引数1" "引数 2" "引数3"
$* の出力: 引数1 引数 2 引数3
$@ の出力: 引数1 引数 2 引数3
結果は同じように見えますが、引数をループ処理すると違いがわかります。
example.sh
#!/bin/bash
echo "Using \$*:"
for arg in $*; do
    echo "$arg"
done
echo "Using \$@:"
for arg in "$@"; do
    echo "$arg"
done
このスクリプトを実行すると、次のような出力が得られます。
$ bash ./example.sh "引数1" "引数 2" "引数3"
Using $*:
引数1
引数
2
引数3
Using $@:
引数1
引数 2
引数3
この例では、$* を使用した場合、引数がスペースで分割されてしまい、"引数 2" が2つの引数として扱われてしまいます。一方、$@ を使用した場合、引数は正しく処理され、空白を含む引数も1つの引数として扱われます。
