根据这个页面, $@ 和 $* 做几乎相同的事情:
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)
其他来源
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)
您可以查看Bash 初学者指南以获取更多信息。这些做几乎相同的事情,但它们的分离方式不同:
$*- 扩展到位置参数,从 1 开始。当扩展发生在双引号内时,它扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。
$@- 扩展到位置参数,从 1 开始。当扩展发生在双引号内时,每个参数都扩展为一个单独的词。
但是除非您设置IFS为其他值,否则默认值可能看起来相同。
| 归档时间: |
|
| 查看次数: |
137081 次 |
| 最近记录: |