在shell脚本中,$@和$*有什么区别?

6

在我的script.sh脚本中:

aa=$@
bb=$*
echo $aa
echo $bb

运行时:
 source script.sh a b c d e f g

我理解的是:

a b c d e f g
a b c d e f g

$@$*有什么区别?


@mat 为什么谷歌没有找到所有其他的重复内容? - 0x90
1
@0x90:Google不会索引“标点符号”,只会索引单词;尝试使用symbolhound来搜索这类内容。 - Gordon Davisson
1个回答

13

$*$@ 没有区别,但是"$@""$*" 是不同的。

$ cat 1.sh
mkdir "$*"

$ cat 2.sh
mkdir "$@"

$ sh 1.sh a "b c" d

$ ls -l
total 12
-rw-r--r-- 1 igor igor   11 mar 24 10:20 1.sh
-rw-r--r-- 1 igor igor   11 mar 24 10:20 2.sh
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a b c d

我们向脚本传递了三个参数 (a, b cd),但在"$*"中它们被合并成一个参数 a b c d

$ sh 2.sh a "b c" d

$ ls -l
total 24
-rw-r--r-- 1 igor igor   11 mar 24 10:20 1.sh
-rw-r--r-- 1 igor igor   11 mar 24 10:20 2.sh
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 a b c d
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 b c
drwxr-xr-x 2 igor igor 4096 mar 24 10:21 d
你可以在这里看到,"$*" 意味着始终只有一个参数,而 "$@" 包含与脚本拥有的参数数量相同的参数。"$@" 是一个特殊的标记,它意味着“将每个单独的参数用引号括起来”。因此,a "b c" d 变成(或保持)"a" "b c" "d",而不是 "a b c d""$*")或 "a" "b" "c" "d"$@$*)。

此外,我建议您阅读这篇关于这个主题的精美文章:

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接