【问题标题】:Can you assign associative arrays to variables in bash?您可以将关联数组分配给bash中的变量吗?
【发布时间】:2013-06-10 13:06:49
【问题描述】:

我有几个不同的关联数组作为变量:

declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )

我希望能够做的是获取第三个变量并将其分配给一个或另一个,例如:

usethisarray=$FIRST

或许

declare -a usethisarray=$FIRST

但这些都不是真正的工作。我可以得到一定程度的间接指向我需要的关联数组吗?

【问题讨论】:

  • 区分大小写是不是很麻烦? -a-A?
  • 对不起,我在这里打错了。我确实在实际脚本中使用了 -A,但它不起作用......

标签: bash


【解决方案1】:

bash 有 variable indirection,但使用起来有点痛苦:

$ declare -A FIRST=( [hello]=world [foo]=bar )
$ alias=FIRST
$ echo "${!alias[foo]}"

$ item=${alias}[foo]
$ echo ${!item}
bar

【讨论】:

  • 就是这样,这就是我要找的。你是对的,使用起来有点痛苦。叹息……
  • 这不是真正的正确答案,你需要一个nameref,见the other answer:stackoverflow.com/a/70070402/537554
  • 在我看来,namerefs 在 2013 年是一个相当新的功能。
【解决方案2】:

我认为这是唯一的方法:

#!/bin/bash
declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )
declare -A usethisarray
for key in ${!FIRST[@]}; do
    usethisarray["$key"]="${FIRST["$key"]}"
done
echo ${usethisarray[hello]}
echo ${usethisarray[foo]}

【讨论】:

    【解决方案3】:

    我想这就是你的意思:

    [bob in ~] ARRAY=(一二三)

    [bob in ~] echo ${ARRAY[*]} 一二三

    [bob in ~] echo $ARRAY[] 一个[]

    [bob in ~] echo ${ARRAY[2]} 三

    [bob in ~] ARRAY[3]=四

    [bob in ~] echo ${ARRAY[*]} 一二三四

    参考如下:

    查看链接了解更多信息: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html

    【讨论】:

    • 对不起,也试试这个链接。更多与您所要求的有关。 stackoverflow.com/questions/6660010/…
    • 文本并不是我真正想要的,因为那只是标准的数组操作。另一个 stackoverflow 链接更接近一些,因为它谈到了重命名关联数组。我需要的是一种间接引用正确关联数组的方法(我的脚本有几个不同的)。我希望能够设置一个变量以在需要时引用/复制正确的变量。
    • 这里有一个直接引用数组的例子:stackoverflow.com/questions/11180714/…
    【解决方案4】:

    字符串变量间接法

    ARRAY=([a]=1 [b]=2 [c]=3)
    
    name="ARRAY"
    
    eval a=\${$name['a']}
    
    eval b=\${$name['b']}
    
    eval c=\${$name['c']}
    
    echo "$a$b$c"
    
    Output>>> 123
    
    eval $array['a']=10             
    
    echo ${ARRAY['a']}
    
    
    Output>>> 10
    

    【讨论】:

      【解决方案5】:

      答案是肯定的,并且引用变量需要是 nameref 才能与数组一起使用:

      declare -A FIRST=( [hello]=world [foo]=bar )
      declare -A SECOND=( [bonjour]=monde [fu]=ba )
      
      #### ordinary variable assignment does NOT work
      declare any_var=FIRST
      echo -e '${any_var[@]}:' "${any_var[@]}"
      echo -e '${!any_var[@]}:' "${!any_var[@]}"
      echo -e '${#any_var[@]}:' "${#any_var[@]}"
      
      #### nameref works, via 'declare -n' or 'local -n'
      declare -n arr_ref=SECOND
      echo '${arr_ref[@]}:' "${arr_ref[@]}"
      echo '${!arr_ref[@]}:' "${!arr_ref[@]}"
      echo '${#arr_ref[@]}:' "${#arr_ref[@]}"
      

      结果:

      普通变量赋值不起作用

      ${any_var[@]}: FIRST
      ${!any_var[@]}: 0
      ${#any_var[@]}: 1
      

      nameref 工作,通过 'declare -n' 或 'local -n'

      ${arr_ref[@]}: monde ba
      ${!arr_ref[@]}: bonjour fu
      ${#arr_ref[@]}: 2
      

      https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters

      数组变量不能被赋予 nameref 属性。但是,nameref 变量可以引用数组变量和下标数组变量。

      同时,可变间接,或者更准确地说是indirect expansion,并不是真正的a pain to use,只是不适合这样的用例:

      如果 parameter 的第一个字符是感叹号 (!),并且 parameter 不是 nameref,则它引入了间接级别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多