我正在运行一个脚本:./some_script arg1 arg2 "multiple words arg3" arg4
。我想将参数($@
)分解为数组。此代码段仅适用于没有空格的参数:
arr=($@)
如果我想将正确的参数存储到数组中,我必须使用:
arr=("$@")
为什么要将$@
括在引号中?
我认为这与参数扩展和special parameters有关,但我不认为我做得好。
答案 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
- 即。变量扩展后,引号会保留特殊字符。
换句话说,当你没有用引号括起变量扩展时,变量扩展到的内容将进一步扩展,在这种情况下会消除第三个参数周围的双引号。