Bash数组创建:(“$ @”)vs($ @)

时间:2014-03-02 17:53:21

标签: linux bash shell

我正在运行一个脚本:./some_script arg1 arg2 "multiple words arg3" arg4。我想将参数($@)分解为数组。此代码段仅适用于没有空格的参数:

arr=($@)

如果我想将正确的参数存储到数组中,我必须使用:

arr=("$@")

为什么要将$@括在引号中?

我认为这与参数扩展和special parameters有关,但我不认为我做得好。

2 个答案:

答案 0 :(得分:5)

在shell中,每当一个变量(包括$@等特殊参数)被引用而没有双引号时,该值在扩展后会经过分词和通配符扩展。例如:

$ var="FOO * BAR"
$ printf "%s\n" "$var"
FOO * BAR
$ printf "%s\n" $var
FOO
Desktop
Documents
Downloads
Library
Movies
Music
Pictures
Public
BAR

在第二种情况下,变量值“FOO * BAR”被分成单独的单词(“FOO”,“*”和“BAR”),然后“*”被扩展为匹配文件列表。这就是为什么你几乎总想把变量引用放在双引号中。

同样适用于$@ - 如果它不是双引号,它会扩展到参数列表中,然后它们中的每一个都经历相同的单词拆分和通配符扩展{{1经历了上面。如果它是双引号,则参数值保持不受干扰。

BTW,还有另一种获取参数的方法:$var。这与$*的不同之处在于它将所有参数值与它们之间的空格粘在一起(而$@将每个参数保持为单独的单词)。在双引号中,$@给出一个由所有参数组成的单词。如果没有双引号,"$*"会将所有参数组合在一起,然后重新拆分它们(可能在相同位置,可能不是),并进行通配符扩展。可能不是你想要的。

答案 1 :(得分:2)

如果您没有用引号括起来,"multiple words arg3"会进一步扩展为multiple words arg3 - 即。变量扩展后,引号会保留特殊字符。

换句话说,当你没有用引号括起变量扩展时,变量扩展到的内容将进一步扩展,在这种情况下会消除第三个参数周围的双引号。