为什么此语法对于声明关联数组不起作用

nish

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

#!/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----------
你好

(据我所知)目前尚无法在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的SO Q&A :如何将关联数组分配给另一个变量名(例如,重命名变量)?,它说明了一种使用此方法的方法,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这是一个很难遵循的代码段,并显示了为什么确实应该避免使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章