Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本中$@和$*之间的差异_Bash - Fatal编程技术网

bash脚本中$@和$*之间的差异

bash脚本中$@和$*之间的差异,bash,Bash,我是bash新手,我正在学习它,我对使用$@和S*之间的真正区别表示怀疑 我这里是红色的 我知道两者都扩展到位置参数,但差异出现在双引号中。 顺便说一句,“$@”=“$1”“$2”…“$n”可能不同于“S*”=“$1$2…$n” 我试着用一个简单的脚本来理解它: if [ $# -gt 0 ]; then echo "Your command line contains $# arguments" else echo "Your command line conta

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

我这里是红色的

我知道两者都扩展到位置参数,但差异出现在双引号中。 顺便说一句,
“$@”=“$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\u script par1 par2 par3

结果总是一样的:

Params are:
par1 par2 par3
par1 par2 par3
par1 par2 par3
par1 par2 par3
也许我不明白这两个特殊变量的真正用途,也不知道我的例子是否正确。我想用一个很好的例子来说明这一点。

来自:

“$*”所有位置参数(作为单个字)*

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

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

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

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


使用
echo
时,它们可能看起来相同,但这是因为
echo
对它们的处理是相同的,而不是等效的

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

您将获得结果
ARGV[1]==“par1”
ARGV[2]==“par2”
ARGV[3]==“par3”

如果使用
/my\u C$*
将给定给bash脚本的三个命令行参数传递给C程序

您将得到结果ARGV[1]=“par1 par2 par3”

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


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

另请参见“确定”。很抱歉重复了这个问题,但我想在我的示例中理解。链接的问题有非常详细的解释。请看大量的解释!非常感谢。谢谢你的C解释。所以在我的例子中使用echo并不是为了理解不同的意思。确切地说,@Kyrol。当在变量中循环时,您可以获得更正确的信息,以显示它得到的是哪些“片段”。还有一个疑问:在这种情况下,您使用的
循环中的
“${@}”
“$@”
之间存在差异?我认为是一样的。是的,@Kyrol,
${var_name}
$var_name
是完全一样的。我之所以写这个,是因为我在检查我的答案,空格在哪里起作用,在哪里用
“${x[@]}”
来考虑。我看到了你回答的问题。再次感谢您的解释!;)
$ ./a par1 par2 par3
Your command line contains 3 arguments
Params for: $@
par1 --
par2 --
par3 --
Params for : $*
par1 par2 par3 --