[英]Bash: quoted array expansion leads to strange results
在尝试bash数组时,我偶然发现了难以解释的行为。
> arr=("a" "b")
> bash -c "echo ${arr[*]}"
a b
> bash -c "echo ${arr[@]}"
a
bash手册的相关部分指出:
$ {!name [@]},$ {!name [*]}:如果name是一个数组变量,则扩展到name中分配的数组索引(键)列表。 [...]当使用“ @”并且扩展名出现在双引号中时,每个键都会扩展为一个单独的单词。
据我了解,我希望后一个示例从bash -c "echo ${arr[@]}"
扩展到bash -c "echo \\"a\\" \\"b\\""
(甚至bash -c "echo ab"
)并在子外壳中输出ab
。
那么,哪个是正确的行为? 观察到的行为? 我期望的行为? 还是完全不同的东西?
您可以在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 a
和b
,第一个用作运行命令,第二个解释为$0
的值或外壳名称。 以下任何自变量都将用于设置位置参数。
"echo ${arr[@]}"
扩展为两个单词, echo a
和b
。 手册还说
如果存在-c选项,那么将从第一个非选项参数command_string中读取命令。 如果在command_string之后有参数,则第一个参数分配给$ 0 ,其余所有参数分配给位置参数。 $ 0的赋值设置外壳的名称,该名称用于警告和错误消息。
因此,您将b
分配给$0
。
概念证明:
$ arr=(a b)
$ bash -c "echo \$0; echo ${arr[@]}"
b
a
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.