linux – Bash数组创建:(“$@”)vs($@)
发布时间:2020-12-14 01:12:26 所属栏目:Linux 来源:网络整理
导读:我正在运行一个脚本:./ some_script arg1 arg2“多个单词arg3”arg4.我想将参数($@)分解为数组.此代码段仅适用于没有空格的参数: arr=($@) 如果我想将正确的参数存储到数组中,我必须使用: arr=("$@") 为什么我要在引号中附上$@? 我认为这与参数扩展和spe
我正在运行一个脚本:./ some_script arg1 arg2“多个单词arg3”arg4.我想将参数($@)分解为数组.此代码段仅适用于没有空格的参数:
arr=($@) 如果我想将正确的参数存储到数组中,我必须使用: arr=("$@") 为什么我要在引号中附上$@? 我认为这与参数扩展和special parameters有关,但我不认为我做得好. 解决方法
在shell中,每当一个变量(包括像$@这样的特殊参数)被引用而没有双引号时,该值在扩展后会经过分词和通配符扩展.例如:
$var="FOO * BAR" $printf "%sn" "$var" FOO * BAR $printf "%sn" $var FOO Desktop Documents Downloads Library Movies Music Pictures Public BAR 在第二种情况下,变量值“FOO * BAR”被分成单独的单词(“FOO”,“*”和“BAR”),然后“*”被扩展为匹配文件列表.这就是为什么你几乎总想把变量引用放在双引号中的原因. 同样的事情适用于$@ – 如果它不是双引号,它会扩展到参数列表中,然后它们中的每一个都受到$var在上面经历的相同的单词拆分和通配符扩展.如果它是双引号,则参数值保持不受干扰. 顺便说一句,还有另一种获取参数的方法:$*.这与$@的不同之处在于它将所有参数值与它们之间的空格结合在一起(而$@将每个参数保持为单独的单词).在双引号中,“$*”给出一个由所有参数组成的单词.如果没有双引号,$*将所有参数组合在一起,然后重新拆分它们(可能在相同位置,可能不是),并进行通配符扩展.可能不是你想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |