$@ 和 $* 有什么区别

spu*_*der 97 shell bash

根据这个页面, $@ 和 $* 做几乎相同的事情:

The $@ holds list of all arguments passed to the script. 
The $* holds list of all arguments passed to the script.
Run Code Online (Sandbox Code Playgroud)

在谷歌搜索所有热门搜索后,我找不到任何解释为什么会有 2 个看似重复的语法。

它们在我的脚本中的工作方式似乎相同。

cat foo.sh
#!/bin/bash
echo The parameters passed in are $@
echo The parameters passed in are $*

./foo.sh herp derp
The parameters passed in are herp derp
The parameters passed in are herp derp
Run Code Online (Sandbox Code Playgroud)
  1. 一个比另一个更受欢迎吗?
  2. 为什么有 2 个内置变量来做完全相同的事情?

其他来源
bash.cyberciti.biz

gol*_*cks 140

他们不一样。 $*是单个字符串,而$@是实际数组。要查看差异,请像这样执行以下脚本:

 > ./test.sh one two "three four"
Run Code Online (Sandbox Code Playgroud)

剧本:

#!/bin/bash

echo "Using \"\$*\":"
for a in "$*"; do
    echo $a;
done

echo -e "\nUsing \$*:"
for a in $*; do
    echo $a;
done

echo -e "\nUsing \"\$@\":"
for a in "$@"; do
    echo $a;
done

echo -e "\nUsing \$@:"
for a in $@; do
    echo $a;
done              
Run Code Online (Sandbox Code Playgroud)

四种情况的解释和结果如下。

在第一种情况下,参数被视为一个长引号字符串:

Using "$*":
one two three four
Run Code Online (Sandbox Code Playgroud)

情况 2(未加引号) - 字符串被for循环分解为单词:

Using $*:
one
two
three
four
Run Code Online (Sandbox Code Playgroud)

情况 3 - 它将 $@ 的每个元素视为带引号的字符串:

Using "$@":
one
two
three four
Run Code Online (Sandbox Code Playgroud)

最后一种情况 - 它将每个元素视为一个不带引号的字符串,因此最后一个元素再次被分割为for three four

Using $@:
one
two
three
four
Run Code Online (Sandbox Code Playgroud)


phe*_*mer 19

不同之处在于它们的扩展方式。

$*扩展为单个参数,所有元素以空格分隔(实际上是 的第一个字符$IFS)。
$@扩展为多个参数。

例如

#!/bin/bash
echo "With *:"
for arg in "$*"; do echo "<$arg>"; done
echo
echo "With @:"
for arg in "$@"; do echo "<$arg>"; done
Run Code Online (Sandbox Code Playgroud)

 

$ /tmp/test.sh 1  2 "3  4"
With *:
<1 2 3  4>

With @:
<1>
<2>
<3  4>
Run Code Online (Sandbox Code Playgroud)

  • OP想知道`$*`和`$@`之间的区别,而不是`"$*"`和`"$@"`之间的区别。 (3认同)

Kar*_*son 7

您可以查看Bash 初学者指南以获取更多信息。这些做几乎相同的事情,但它们的分离方式不同:

$*- 扩展到位置参数,从 1 开始。当扩展发生在双引号内时,它扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。

$@- 扩展到位置参数,从 1 开始。当扩展发生在双引号内时,每个参数都扩展为一个单独的词。

但是除非您设置IFS为其他值,否则默认值可能看起来相同。


cuo*_*glm 5

一个比另一个更受欢迎吗?

一个简短的答案是"$@"

如果不使用双引号使用它们,它们是相同的。在这种情况下,没有人优先于另一个。但我建议你总是用双引号来使用它们,除非你知道你到底想要什么。

为什么有 2 个内置变量来做完全相同的事情?

$*和之间没有区别$@,但是"$@""$*"有。

你可以在这篇文章中看到我的回答,看看它们有什么不同。


归档时间:

查看次数:

137081 次

最近记录:

5 年,2 月 前