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

标签 linux bash shell

我正在运行一个脚本:./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/

相关文章:

c++ - Linux/Windows 的 sleep 时间

php - 以 root 用户身份运行 PHP shell_exec()

mysql - 在所有远程服务器上运行 mysql 命令的脚本

linux - 将 3 个功能合并为一个

linux - 获取 linux shell 名称

node.js - 由于 NO_PUBKEY 未找到错误,无法在 Ubuntu 18.04.5 LTS 上安装 NodeJS 14 或 16

linux - 最后创建的远程文件上的 Bash cat

linux - 为什么 `bash` 命令会忽略别名?

BASH 语法错误 - [ : missing `]'

linux - 查找两个主目录下同名子目录但内容不同的文件