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$

这表明[*]工作正常。但是这个 tut提到要使用[@]

两者都同样有效吗?

4

2 回答 2

10

差异主要在数组元素包含空格等,尤其是多个空格时很重要,并且仅在表达式用双引号引起来时才明显:

$ 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手册:

于 2013-05-18T19:20:54.630 回答
2

去引用man bash

如果下标是 @ 或 *,则单词将扩展到 name 的所有成员。只有当单词出现在双引号中时,这些下标才会有所不同。如果单词是双引号,则 ${name[*]} 扩展为单个单词,每个数组成员的值由 IFS 特殊变量的第一个字符分隔,${name[@]} 扩展命名为一个单独的词。当没有数组成员时,${name[@]} 扩展为空。如果双引号扩展出现在一个单词中,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。

于 2013-05-18T19:16:29.447 回答