linux - $* 和 $@ 有什么区别

标签 linux shell unix

谁能简单解释一下

  1. $* 和 $@ 有什么区别?
  2. 为什么和上面一样的内容有两个变量?

最佳答案

如果您不将 $*$@ 放在引号中,则没有区别。但是,如果您将它们放在引号内(作为一般的良好做法,您应该这样做),则 $@ 会将您的参数作为单独的参数传递,而 $* 只会传递所有参数作为单个参数。

使用这些脚本(foo.shbar.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, arg2arg3 作为单独的参数

./bar.sh $@ => bar.sh 获取 arg1, arg2arg3 作为单独的参数

情况 2:您在 $*$@ 周围使用引号:

./bar.sh "$*" => bar.sh 获取 arg1 arg2 arg3 作为单个参数

./bar.sh "$@" => bar.sh 获取 arg1, arg2arg3 作为单独的参数

更重要的是,$* 还会忽略参数列表中的引号。例如,如果您提供了 ./foo.sh arg1 "arg2 arg3",即使这样:

./bar.sh "$*" => bar.sh 仍然会收到 arg2arg3 作为单独的参数!

./bar.sh "$@" => 会将 arg2 arg3 作为单个参数传递(这是您通常需要的)。

再次注意,只有将 $*$@ 放在引号中时才会出现这种差异。否则他们有相同的行为。

官方文档:http://www.gnu.org/software/bash/manual/bash.html#Special-Parameters

关于linux - $* 和 $@ 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589032/

相关文章:

linux - 提取 cpio.gz 里面有两个文件

java - 我可以从 System.nanoTime 合理预期的最差分辨率是多少?

python - 为什么 "End of File"(EOF) 是此处文档的实际分隔符?

unix -/dev/tty 有什么特别之处?

bash - 如何使用 shell 脚本从第二列中选择一个值?

linux - 这个命令(shell代码)问题有什么解决方案吗

unix - Unix下如何获取文件的修改日期(包括年份)?

linux - 我们如何添加应用程序远程启动(Linux)

Linux Shell 脚本 : Script Check

c++ - CMake + freeglut3 : cannot find usbhid. h