bash
无异议地评估以下表达式:
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )
...但它一点也不喜欢这个:
declare -A SPANISH=( $( echo "[rojo]=red [verde]=green [azul]=blue" ) )
bash: SPANISH: $( echo "[rojo]=red [verde]=green [azul]=blue" ): must use subscript when assigning associative array
我尝试了多种变体,但结果总是出现must use subscript when assigning associative array
上述错误的一个或多个实例。
当然,这个例子很愚蠢。它的唯一目的是说明使用命令替换初始化bash关联数组的问题。
这可以做到吗?
具体来说,继续上面那个愚蠢的例子,<COMMAND>
这样的命令是什么
declare -A SPANISH=( $( <COMMAND> ) )
...产生与产生的结果相同的最终结果
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )
多于?
顺便说一句,zsh
处理这种情况没有任何问题:
$ declare -A SPANISH=( $( echo "rojo red verde green azul blue" ) )
$ echo "${SPANISH[azul]}"
blue
或者:
或者:
就此而言,
使用 bash 5.1 为我工作,尽管您也可以使用 bash,因为
eval
这基本上就是这里发生的事情,bash 最终将命令的输出解释为代码。例如,与
将运行
reboot
与以下相同:明确使用
eval
将使命令注入漏洞的存在路径更加清晰,并且在将来修复混乱的设计的情况下更有可能是面向未来的。为了更安全的方法,您可以输出
cmd
以 NUL 分隔的键和值(因为 bash 变量无论如何不能包含 NUL)并在循环中填充关联数组,另外通常需要注意的是 bash 中的关联数组不能'没有带空键的元素。