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$
这表明[*]
工作正常。但是this tut提到要使用[@]
。
两者同样有效吗?
答案 0 :(得分:8)
差异主要是当数组元素包含空格等,特别是多个空格时,并且仅在表达式用双引号括起时才显现:
$ 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
手册:
答案 1 :(得分:1)
引用man bash
如果 下标是@或*,单词扩展为name的所有成员。这些 只有当单词出现在双引号内时,下标才有所不同。如果 单词是双引号,$ {name [*]}扩展为单个单词 每个数组成员的值由IFS的第一个字符分隔 特殊变量,$ {name [@]}将名称的每个元素扩展为sep- arate word。如果没有数组成员,$ {name [@]}将扩展为 没有。如果双引号扩展发生在一个单词内,则 扩展第一个参数与开头部分连接起来 原始单词,并加入最后一个参数的扩展 用原始单词的最后一部分。