$* も $@ もシェルに渡されたすべての引数。
ただし、""ダブルクォーテーションでくくった際には、
$*はすべての引数を一つの文字列として展開し、
$@はすべての引数を個別の文字列として展開する。
exampleというスクリプトを次のように実行したとする。
$ ./example arg1 arg2 arg3
"$*" は "arg1 arg2 arg3"
"$@" は "arg1" "arg2" "arg3"
となる。
こちらのサイトが大変参考になりました。
『UNIX & Linux コマンド・シェルスクリプト リファレンス』http://shellscript.sunone.me/variable.html
どういう時に使い分けるのだろうかと疑問だったのだけど、
for文で
for i "$*"とすると、"arg1 arg2 arg3" とすべての引数がまとめてiに代入されるのに対し、
for i "$@"とすると、"arg1" "arg2" "arg3" と個別に代入されるのだそうです。