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

时间:2013-05-18 19:08:50

标签: bash

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提到要使用[@]

两者同样有效吗?

2 个答案:

答案 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 [@]}将扩展为          没有。如果双引号扩展发生在一个单词内,则          扩展第一个参数与开头部分连接起来          原始单词,并加入最后一个参数的扩展          用原始单词的最后一部分。