我不明白为什么"${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 。"$*"