"$*"と"$@"の挙動の違い

なんてことだ、引数が0個の時 "$*"がそのまま対象となるコマンドにわたされてる。
ひとつ余計なifが必要かな。
と、おもったら"$@"ならOKだった。


(1 から始まる) 全ての位置パラメータに展開されます。 ダブルクォートの内部で展開が行われたときは、 それぞれのパラメータを特別な変数である IFS の最初の文字で区切って並べた 1 つの単語に展開されます。つまり、 "$*" は "$1c$2c..." と同じです。 ここで c は変数 IFS の値の最初の文字です。 IFS が設定されていなければ、パラメータは空白で区切られます。 IFS が空文字列の場合、パラメータの間には区切り文字は入らず、 全てのパラメータは繋げられます。

(1 から始まる) 全ての位置パラメータに展開されます。 ダブルクォートの内部で展開が行われたときは、 それぞれのパラメータは別々の単語に展開されます。 つまり "$@" は "$1" "$2" ... と同じです。 位置パラメータが無い場合には、"$@" と $@ を展開しても空文字列になります (つまり取り除かれます)。

そうか、「位置パラメータが無い場合には、"$@" と $@ を展開しても空文字列になります 」ということだな。

$ function a(){ echo $#,"$@"; `which gosh` "$@"; } ; a
0,
gosh>

$ function a(){ echo $#; echo "$*"; `which gosh` "$*"; } ; a
0

*** ERROR: bad script name
Stack Trace:
_______________________________________
$ `which gosh` "$*"
*** ERROR: bad script name
Stack Trace:
_______________________________________
$ `which gosh` $*
gosh>
$ function a(){ echo $#,"$*"; if [ $# -eq 0 ]; then `which gosh`; else `which gosh` "$*"; fi } ; a
0,
gosh>