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]
$

二重引用符の外では、違いはありません。二重引用符内では、*「単一の文字列」を@意味し、「個々の配列要素」を意味します。

$*これは、 and $@(および"$*"and "$@")の動作によく似ています。

bash次のマニュアルを参照してください。

于 2013-05-18T19:20:54.630 に答える