我正在运行一个脚本:./some_script arg1 arg2 "multiple words arg3" arg4.我想将arguments($@)分解为数组.此代码段仅适用于没有空格的参数:
arr=($@)
Run Code Online (Sandbox Code Playgroud)
如果我想将正确的参数存储到数组中,我必须使用:
arr=("$@")
Run Code Online (Sandbox Code Playgroud)
我为什么要用$@引号括起来?
我认为这与参数扩展和特殊参数有关,但我不认为我做得好.
在shell中,每当$@引用的变量(包括特殊参数)没有双引号时,该值在扩展后经过分词和通配符扩展.例如:
$ var="FOO * BAR"
$ printf "%s\n" "$var"
FOO * BAR
$ printf "%s\n" $var
FOO
Desktop
Documents
Downloads
Library
Movies
Music
Pictures
Public
BAR
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,变量值"FOO*BAR"被分成单独的单词("FOO","*"和"BAR"),然后"*"被扩展为匹配文件列表.这就是为什么你几乎总想把变量引用放在双引号中的原因.
同样的事情适用于$@- 如果它不是双引号,它会扩展到参数列表中,然后它们中的每一个都经历上面经历的相同的单词拆分和通配符扩展$var.如果它是双引号,则参数值保持不受干扰.
顺便说一句,还有另一种获取参数的方法:$*.这不同之处$@在于它将所有参数值与它们之间的空格粘在一起(同时$@将每个参数保持为单独的单词).在双引号中,"$*"给出一个由所有参数组成的单词.如果没有双引号,$*则将所有参数组合在一起,然后重新拆分它们(可能在相同位置,可能不是),并进行通配符扩展.可能不是你想要的.
| 归档时间: |
|
| 查看次数: |
5347 次 |
| 最近记录: |