加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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在上面经历的相同的单词拆分和通配符扩展.如果它是双引号,则参数值保持不受干扰.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读