重击:引用数组扩展导致奇怪的结果

时间:2019-11-25 16:27:38

标签: arrays bash subshell

尝试bash数组时,我偶然发现了难以解释的行为。

> arr=("a" "b")
> bash -c "echo ${arr[*]}"
a b
> bash -c "echo ${arr[@]}"
a

bash manual的相关部分说明:

  

$ {!name [@]},$ {!name [*]}:如果 name 是一个数组变量,则扩展到name中分配的数组索引(键)列表。 [...]使用“ @”并且扩展名出现在双引号中时,每个键都会扩展为一个单独的单词。

据我所知,我希望后一个示例从bash -c "echo ${arr[@]}"扩展到bash -c "echo \"a\" \"b\""(甚至是bash -c "echo a b")并在子shell中输出a b

那么,正确的行为是什么?观察到的行为?我期望的行为?还是完全不同的东西?

2 个答案:

答案 0 :(得分:2)

您可以在set -xv下运行代码,以查看bash如何扩展变量:

choroba@triangle:~ $ (set -xv ; arr=("a" "b") ; bash -c "echo ${arr[@]}")
+ arr=("a" "b")
+ bash -c 'echo a' b
a

"echo ${arr[@]}"扩展为两个词echo ab,第一个用作命令运行,第二个被解释为{{1 }}或外壳名称。以下任何参数都将用于设置位置参数。

答案 1 :(得分:1)

{{ $vuetify.lang.t('$vuetify.my-component.text') }}扩展为两个词"echo ${arr[@]}"echo a。手册还说

  

如果存在-c选项,那么将从第一个非选项参数command_string中读取命令。 如果在command_string之后有参数,则第一个参数分配给$ 0 ,其余所有参数分配给位置参数。分配给$ 0设置外壳的名称,该名称用于警告和错误消息。

因此,您要将b分配给b

概念证明:

$0