Bash数组变量:[@]或[*]?

5
bash-3.2$ echo astr | sed 'hah' | sed 's/s/z/'
sed: 1: "hah": extra characters at the end of h command
bash-3.2$ echo ${PIPESTATUS[*]}
0 1 0
bash-3.2$ echo astr | sed 'hah' | sed 's/s/z/'
sed: 1: "hah": extra characters at the end of h command
bash-3.2$ PIPERET=("${PIPESTATUS[*]}")
bash-3.2$ echo ${PIPERET[*]}
0 1 0
bash-3.2$

这表明[*]运作良好。但是这个教程提到应该使用[@]。这两种方式都是有效的吗?

请参阅此处(http://tldp.org/LDP/abs/html/internalvariables.html),了解`PIPESTATUS[*]`与`PIPESTATUS[@]`的区别。 - devang
2个回答

11

当数组元素包含空格等内容,特别是多个空格时,差异主要在于只有将表达式用双引号括起来时才会体现:

$ x=( '   a  b  c   ' 'd  e  f' )
$ printf "[%s]\n" "${x[*]}"
[   a  b  c    d  e  f]
$ printf "[%s]\n" "${x[@]}"
[   a  b  c   ]
[d  e  f]
$ printf "[%s]\n" ${x[@]}
[a]
[b]
[c]
[d]
[e]
[f]
$ printf "[%s]\n" ${x[*]}
[a]
[b]
[c]
[d]
[e]
[f]
$

在双引号外没有区别。 在双引号内,*表示“一个字符串”,@表示“分别是数组元素”。

这与$*$@(以及"$*""$@")的工作方式非常相似。

请参阅 bash 手册中的:


2

引用自man bash

如果 subscript 是 @ 或 *,则该单词扩展为 name 的所有成员。这些下标仅在单词出现在双引号内时才有所不同。如果单词被双引号括起来,则 ${name[*]} 扩展为一个单词,其值为每个数组成员由 IFS 特殊变量的第一个字符分隔,而 ${name[@]} 则将 name 的每个元素扩展为一个单独的单词。当没有数组成员时,${name[@]} 扩展为空。如果双引号扩展出现在单词内,则第一个参数的扩展与原始单词的开头部分连接,并且最后一个参数的扩展与原始单词的最后部分连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接