为什么此语法不适用于声明关联数组

为什么此语法不适用于声明关联数组

我可以在 () 语法中使用变量吗

#!/bin/bash
declare -A c
declare -A b
a="[a]=0 [b]=1 [c]=2 [d]=3"
b=($a) # or b=($(echo "$a"))
echo "***********${b[@]}*********"  #********************

c=([a]=0 [b]=1 [c]=2 [d]=3)
echo "---------${c[@]}----------"  #---------0 1 2 3----------

答案1

目前(据我所知)不可能在 Bash 中获取字符串并用它们创建关联数组。因此,您必须在使用该语句之前“评估”它们eval

当我运行你的示例时,我使用 Bash 版本 4.1.7 得到以下信息:

$ ./arr.bash 
./arr.bash: line 5: b: [a]=0: must use subscript when assigning associative array
./arr.bash: line 5: b: [b]=1: must use subscript when assigning associative array
./arr.bash: line 5: b: [c]=2: must use subscript when assigning associative array
./arr.bash: line 5: b: [d]=3: must use subscript when assigning associative array

将此行更改为有效:

eval "b=($a)" # or b=($(echo "$a"))

重新运行你现在得到了预期的结果:

$ ./arr.bash 
***********0 1 2 3*********
---------0 1 2 3----------

解释

我发现这个问答题为:Bash:如何将关联数组分配给另一个变量名(例如重命名变量)?,它说明了一种执行此操作的方法declare,但它表明该方法实际上是多么不可读,并且可能不应该使用。

# declare associative array
declare -A assoc_array=(["key1"]="value1" ["key2"]="value2")
# convert associative array to string
assoc_array_string=$(declare -p assoc_array)
# create new associative array from string
eval "declare -A new_assoc_array="${assoc_array_string#*=}
# show array definition
declare -p new_assoc_array

此方法显示$assoc_array转换为字符串,然后转换回关联数组$new_assoc_array。但即使这样的方法也逃不掉使用的需要eval。这是一个很难理解的代码片段,它说明了为什么应该避免它。

答案2

你需要

eval "b=($a)"

eval在执行参数扩展后将其参数评估为 shell 命令。但请小心使用。确保它$a不是由用户输入设置的,因为这可能会导致各种麻烦。

相关内容