bash脚本中$@和$*之间的差异
我是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
$@
和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 --