bash在没有任何反对意见的情况下计算下列表达式:
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )...but它一点也不喜欢这个:
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关联数组的问题。
这能办到吗?
具体而言,并继续上面的愚蠢示例,什么是命令,这样
declare -A SPANISH=( $( ) )...produces的最终结果与
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )上面?
顺便说一句,zsh处理这种情况时没有任何问题:
$ declare -A SPANISH=( $( echo "rojo red verde green azul blue" ) )
$ echo "${SPANISH[azul]}"
blue发布于 2023-05-11 17:54:59
declare -A "SPANISH=($(echo '[rojo]=red [verde]=green [azul]=blue'))"或者:
declare -A "SPANISH=$(echo '([rojo]=red [verde]=green [azul]=blue)')"或者:
declare -A "$(echo 'SPANISH=([rojo]=red [verde]=green [azul]=blue)')"因为这很重要,
使用bash5.1为我工作,虽然您可能会使用eval,因为这实际上是在这里发生的,bash最终将命令的输出解释为代码。
例如,用
cmd() { echo '[x$(reboot)]=y'; }declare -A "a=($(cmd))"将运行reboot的方式与以下相同:
eval "
declare -A a=($(cmd))
"显式地使用eval将使人更清楚地知道存在命令注入漏洞的路径,并且在将来修复错误的设计时,更有可能成为未来的证据。
为了提供一种更安全的方法,您可以让cmd输出以NUL分隔的键和值(因为bash变量无论如何都不能包含空值),并在循环中填充关联数组,并附加通常的警告,即bash中的关联数组不能有带空键的元素。
fill_assoc() {
local -n _assoc="$1"
local _key _value
while
IFS= read -rd '' _key &&
IFS= read -rd '' _value
do
_assoc[$_key]=$_value
done
}typeset -A assoc
fill_assoc assoc < <(printf '%s\0' rojo red verde green azul blue)https://unix.stackexchange.com/questions/745625
复制相似问题