5

我是 bash 的新手,我正在学习它,我对使用$@和之间的真正区别表示怀疑S*

我在这里红色Bash 特殊参数

我知道两者都扩展到位置参数,但差异出现在双引号内。顺便说一句"$@" = "$1" "$2"..."$n",可能不同于"S*" = "$1$2...$n".

我尝试用一​​个简单的脚本来理解它:

if [ $# -gt 0 ]; then
       echo "Your command line contains $# arguments" 
else
       echo "Your command line contains no arguments"
       exit  fi

echo "Params are: "
echo $@  
echo $* 
echo "$@"    
echo "$*"

如果我像这样在终端中执行我的脚本~./my_script par1 par2 par3

结果总是一样的:

Params are:
par1 par2 par3
par1 par2 par3
par1 par2 par3
par1 par2 par3

也许我不了解这两个特殊变量的真正用途以及我的示例是否正确。我也想用一个很好的例子来说明这一点。

4

2 回答 2

4

当您使用它们时,它们可能看起来相同,echo但这是由于它们被视为相同echo而不是等效的。

如果使用 将给 bash 脚本的三个命令行参数传递给 C 程序 ./my_c $@

你得到结果ARGV[1] == "par1" ARGV[2] == "par2" ARGV[3] == "par3"

如果您使用 将 bash 脚本的三个命令行参数传递给 C 程序./my_c $*

你得到结果ARGV[1] == "par1 par2 par3"

ARGV是 C 中提供的参数数组,第一个元素始终是调用程序的命令名)

这是为了让您在脚本后面对给定参数执行的操作具有更大的灵活性。

于 2013-07-31T09:55:12.470 回答
3

http://tldp.org/LDP/abs/html/refcards.html

"$*" 所有位置参数(作为一个单词)*

"$@" 所有位置参数(作为单独的字符串)

这段代码显示了它:给定一个由空格分隔的项目的字符串,$@将每个单词视为一个新项目,同时$*将它们一起视为相同的参数。

echo "Params for: \$@"
for item in "${@}"
do
        echo $item --
done

echo "Params for : \$*"
for item in "${*}"
do
        echo $item --
done

测试:

$ ./a par1 par2 par3
Your command line contains 3 arguments
Params for: $@
par1 --
par2 --
par3 --
Params for : $*
par1 par2 par3 --
于 2013-07-31T09:50:51.250 回答