gpt4 book ai didi

linux - Bash 数组创建 : ("$@") vs ($@)

转载 作者:IT王子 更新时间:2023-10-29 01:16:14 26 4
gpt4 key购买 nike

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

arr=($@)

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

arr=("$@")

为什么要用引号将 $@ 引起来?

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

最佳答案

在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”),然后“*”被扩展为匹配文件列表.这就是为什么您几乎总是希望将变量引用放在双引号中。

同样的事情也适用于 $@——如果它不在双引号中,它会被扩展到参数列表中,然后每个参数都经过相同的单词拆分和通配符扩展$var 在上面经历过。如果它在双引号中,则参数值保持不变。

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

关于linux - Bash 数组创建 : ("$@") vs ($@),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22131114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com