引用 bash 数组值时 [@] 和 [*] 之间有什么区别?

arj*_*jan 25 bash array

这个 Bash 指南说:

如果索引号是@*,则引用数组的所有成员。

当我这样做时:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i"
done
Run Code Online (Sandbox Code Playgroud)

它给出了想要的结果:

example.1
example.2
example.3
Run Code Online (Sandbox Code Playgroud)

但是当我使用时${LIST[*]},我得到

example.1 2 3
Run Code Online (Sandbox Code Playgroud)

反而。

为什么?

编辑:使用的时候printf@*实际做给了相同的结果。

Nid*_*dal 22

区别很微妙;"${LIST[*]}"(like "$*") 创建一个参数,而"${LIST[@]}"(like "$@") 会将每个项目扩展为单独的参数,因此:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
    echo "example.$i"
done
Run Code Online (Sandbox Code Playgroud)

将列表处理(打印)作为多个变量。

但:

LIST=(1 2 3)
for i in "${LIST[*]}"; do
    echo "example.$i"
done
Run Code Online (Sandbox Code Playgroud)

将列表作为一个变量处理。


Kus*_*nda 9

使用[*]将创建一个 string,数组的每个元素都与$IFSelements\xc2\xb9 之间的第一个字符(默认为空格)连接。

\n

使用[@]将创建一个列表

\n

例子:

\n

创建数组:

\n
$ list=( a b "big fish" c d )\n
Run Code Online (Sandbox Code Playgroud)\n

单独打印每个元素:

\n
$ printf \'data: ---%s---\\n\' "${list[@]}"\ndata: ---a---\ndata: ---b---\ndata: ---big fish---\ndata: ---c---\ndata: ---d---\n
Run Code Online (Sandbox Code Playgroud)\n

创建单个字符串并打印:

\n
$ printf \'data: ---%s---\\n\' "${list[*]}"\ndata: ---a b big fish c d---\n
Run Code Online (Sandbox Code Playgroud)\n

再次,但使用自定义分隔符:

\n
$ IFS=\'/\'\n$ printf \'data: ---%s---\\n\' "${list[*]}"\ndata: ---a/b/big fish/c/d---\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,使用这些不带双引号的扩展很少有意义。

\n
\n

\xc2\xb9 或没有$IFS设置,但为空(在 后面IFS=),或者如果$IFS未设置(在 后面unset -v IFS)则为空格,如果 的第一个字符$IFS是多字节字符或无法解码为字符的字符,则 shell 之间存在一些变化。

\n