谁能简单解释一下
- $* 和 $@ 有什么区别?
- 为什么和上面一样的内容有两个变量?
最佳答案
如果您不将 $*
或 $@
放在引号中,则没有区别。但是,如果您将它们放在引号内(作为一般的良好做法,您应该这样做),则 $@
会将您的参数作为单独的参数传递,而 $*
只会传递所有参数作为单个参数。
使用这些脚本(foo.sh
和bar.sh
)进行测试:
>> cat bar.sh
echo "Arg 1: $1"
echo "Arg 2: $2"
echo "Arg 3: $3"
echo
>> cat foo.sh
echo '$* without quotes:'
./bar.sh $*
echo '$@ without quotes:'
./bar.sh $@
echo '$* with quotes:'
./bar.sh "$*"
echo '$@ with quotes:'
./bar.sh "$@"
现在这个例子应该让一切都清楚了:
>> ./foo.sh arg1 "arg21 arg22" arg3
$* without quotes:
Arg 1: arg1
Arg 2: arg21
Arg 3: arg22
$@ without quotes:
Arg 1: arg1
Arg 2: arg21
Arg 3: arg22
$* with quotes:
Arg 1: arg1 arg21 arg22 arg3
Arg 2:
Arg 3:
$@ with quotes:
Arg 1: arg1
Arg 2: arg21 arg22
Arg 3: arg3
显然,"$@"
给出了我们通常想要的行为。
更详细的说明:
情况 1:$*
和 $@
没有引号:
两者具有相同的行为。
./bar.sh $*
=> bar.sh
获取 arg1
, arg2
和 arg3
作为单独的参数
./bar.sh $@
=> bar.sh
获取 arg1
, arg2
和 arg3
作为单独的参数
情况 2:您在 $*
和 $@
周围使用引号:
./bar.sh "$*"
=> bar.sh
获取 arg1 arg2 arg3
作为单个参数
./bar.sh "$@"
=> bar.sh
获取 arg1
, arg2
和arg3
作为单独的参数
更重要的是,$*
还会忽略参数列表中的引号。例如,如果您提供了 ./foo.sh arg1 "arg2 arg3"
,即使这样:
./bar.sh "$*"
=> bar.sh
仍然会收到 arg2
和 arg3
作为单独的参数!
./bar.sh "$@"
=> 会将 arg2 arg3
作为单个参数传递(这是您通常需要的)。
再次注意,只有将 $*
和 $@
放在引号中时才会出现这种差异。否则他们有相同的行为。
官方文档:http://www.gnu.org/software/bash/manual/bash.html#Special-Parameters
关于linux - $* 和 $@ 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589032/