为什么“${ARRAY[@]}”在引用时会扩展为多个单词?

为什么“${ARRAY[@]}”在引用时会扩展为多个单词?

我不明白为什么"${ARRAY[@]}"在引用 ( "...") 时会扩展到多个单词?

举个例子:

IFS=":" read -ra ARRAY <<< "foo:bar:baz"
for e in "${ARRAY[@]}"; do echo $e; done
foo
bar
baz

我用引号展开的任何其他变量(例如"${VAR}")都会生成一个单词:

VAR="foo bar baz"
for a in "${VAR}"; do echo $a; done
foo bar baz

谁能向 Linux 新手解释一下这一点?

答案1

因为数组在用@双引号索引时会扩展为元素列表。它记录在man bash“数组”下:

如果该单词被双引号括起来,... ${name[@]}将 name 的每个元素扩展为一个单独的单词。

如果您不希望每个元素都受到 $IFS 字符上的分词和通配符(即 、 或 的扩展)的影响,则需要*?行为[...]

#!/bin/bash
arr=(a 'b c' d)
for el in  ${arr[@]}  ; do echo "1: $el" ; done
for el in "${arr[@]}" ; do echo "2: $el" ; done

输出:

1: a
1: b
1: c
1: d
2: a
2: b c
2: d

如果您希望将数组扩展为单个字符串(数组元素由 的第一个字符分隔$IFS,默认为空格),则使用"${arr[*]}"

"${arr[@]}"数组扩展的and语法"${arr[*]}"类似于位置参数的"$@"and 。"$*"

相关内容