如果索引号是
@或*,则引用数组的所有成员。
当我这样做时:
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)
将列表作为一个变量处理。
使用[*]将创建一个 string,数组的每个元素都与$IFSelements\xc2\xb9 之间的第一个字符(默认为空格)连接。
使用[@]将创建一个列表。
例子:
\n创建数组:
\n$ list=( a b "big fish" c d )\nRun Code Online (Sandbox Code Playgroud)\n单独打印每个元素:
\n$ printf \'data: ---%s---\\n\' "${list[@]}"\ndata: ---a---\ndata: ---b---\ndata: ---big fish---\ndata: ---c---\ndata: ---d---\nRun Code Online (Sandbox Code Playgroud)\n创建单个字符串并打印:
\n$ printf \'data: ---%s---\\n\' "${list[*]}"\ndata: ---a b big fish c d---\nRun Code Online (Sandbox Code Playgroud)\n再次,但使用自定义分隔符:
\n$ IFS=\'/\'\n$ printf \'data: ---%s---\\n\' "${list[*]}"\ndata: ---a/b/big fish/c/d---\nRun Code Online (Sandbox Code Playgroud)\n请注意,使用这些不带双引号的扩展很少有意义。
\n\xc2\xb9 或没有$IFS设置,但为空(在 后面IFS=),或者如果$IFS未设置(在 后面unset -v IFS)则为空格,如果 的第一个字符$IFS是多字节字符或无法解码为字符的字符,则 shell 之间存在一些变化。