首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么<COMMAND>将使‘宣告-A ASSOCIATIVEARRAY=( $( <COMMAND> ))’工作?

什么<COMMAND>将使‘宣告-A ASSOCIATIVEARRAY=( $( <COMMAND> ))’工作?
EN

Unix & Linux用户
提问于 2023-05-11 17:39:35
回答 1查看 26关注 0票数 1

bash在没有任何反对意见的情况下计算下列表达式:

代码语言:javascript
复制
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )

...but它一点也不喜欢这个:

代码语言:javascript
复制
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关联数组的问题。

这能办到吗?

具体而言,并继续上面的愚蠢示例,什么是命令,这样

代码语言:javascript
复制
declare -A SPANISH=( $(  ) )

...produces的最终结果与

代码语言:javascript
复制
declare -A SPANISH=( [rojo]=red [verde]=green [azul]=blue )

上面?

顺便说一句,zsh处理这种情况时没有任何问题:

代码语言:javascript
复制
$ declare -A SPANISH=( $( echo "rojo red verde green azul blue" ) )
$ echo "${SPANISH[azul]}"
blue
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-05-11 17:54:59

代码语言:javascript
复制
declare -A "SPANISH=($(echo '[rojo]=red [verde]=green [azul]=blue'))"

或者:

代码语言:javascript
复制
declare -A "SPANISH=$(echo '([rojo]=red [verde]=green [azul]=blue)')"

或者:

代码语言:javascript
复制
declare -A "$(echo 'SPANISH=([rojo]=red [verde]=green [azul]=blue)')"

因为这很重要,

使用bash5.1为我工作,虽然您可能会使用eval,因为这实际上是在这里发生的,bash最终将命令的输出解释为代码。

例如,用

代码语言:javascript
复制
cmd() { echo '[x$(reboot)]=y'; }
代码语言:javascript
复制
declare -A "a=($(cmd))"

将运行reboot的方式与以下相同:

代码语言:javascript
复制
eval "
  declare -A a=($(cmd))
"

显式地使用eval将使人更清楚地知道存在命令注入漏洞的路径,并且在将来修复错误的设计时,更有可能成为未来的证据。

为了提供一种更安全的方法,您可以让cmd输出以NUL分隔的键和值(因为bash变量无论如何都不能包含空值),并在循环中填充关联数组,并附加通常的警告,即bash中的关联数组不能有带空键的元素。

代码语言:javascript
复制
fill_assoc() {
  local -n _assoc="$1"
  local _key _value
  while
    IFS= read -rd '' _key &&
    IFS= read -rd '' _value
  do
     _assoc[$_key]=$_value
  done
}
代码语言:javascript
复制
typeset -A assoc
fill_assoc assoc < <(printf '%s\0' rojo red verde green azul blue)
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/745625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档