TIPS/sh/$*と$@

Last-modified: 2006-10-09 (月) 20:52:09

*

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

@

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

http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

つまり

"$*"は、引数がひとまとめになる
"$@"は、引数がわたされたとおり別々になる。(ヌル引数もそのまま)

テスト結果

masami@kuro1:~/src/test$ ./test.tcl 'a "" c'
a "" c
$@=a c
$*=a c
1=a
2=
3=c
$@=a c
$*=a c
1=a
2=
3=c
$@=a c
$*=a c
1=a c
2=
3=

テストスクリプト

masami@kuro1:~/src/test$ cat test.tcl
#! /usr/bin/tcl

set buf $argv
set buf [join $buf ]
puts $buf
catch {eval exec ./test.sh $buf} msg
puts $msg

masami@kuro1:~/src/test$ cat test.sh
#! /bin/sh

echo -n '$@='
echo $@
echo -n '$*='
echo $*
echo 1=$1
echo 2=$2
echo 3=$3
./test2.sh "$@"

./test2.sh "$*"

masami@kuro1:~/src/test$ cat test2.sh
#! /bin/sh

echo -n '$@='
echo $@
echo -n '$*='
echo $*
echo 1=$1
echo 2=$2
echo 3=$3

masami@kuro1:~/src/test$