引用bash数组值时,@和*有什么区别?


15

这个Bash指南说:

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

当我这样做时:

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

给出:(example.1 example.2 example.3期望的结果)。

但是当我使用时${LIST[*]},我得到了example.1 2 3

为什么?

编辑:使用printf时,@和*实际上给出相同的结果。


它似乎为我工作。我尝试了@和*,似乎两次都产生了相同的结果。您正在使用什么外壳?运行echo $SHELL输出并将其粘贴到您的问题。
Ramesh 2014年

我的示例是错误的,实际上这仅发生于echo,而不是printf,我刚刚注意到。
arjan


@goldilocks另一个问题是关于$*$@。尽管答案是相似的,一个问题可以视为另一个问题的子集,但它们是不同的问题。
斯特凡Chazelas

Answers:


17

区别是微妙的。“ $ *”创建一个参数,而“ $ @”将扩展为单独的参数,因此:

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

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

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

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


您知道echo和之间的区别printf来自何处吗?因为with printf在for循环中,所以*列表引用被视为多个变量。
arjan 2014年

将某事物视为一个变量而不是多个变量意味着什么?我想知道您是否可以提供一个实际的例子来说明差异。
fraxture
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.