【问题标题】:Bash: Check if key exists in associative arrayBash:检查关联数组中是否存在键
【发布时间】:2020-04-11 04:34:07
【问题描述】:

目标:

我要做的就是检查USER_PARAMETERS_KEYs[j] 是否存在于RPM_PARAMETERS_HASH 中 关联数组。我有一个数组和一个关联数组,如下所示:

预定义:

declare -a USER_PARAMETERS_KEYS='([0]="userField" [1]="fUserField" [2]="srcIPField" [3]="srcPortField" [4]="dstIPField" [5]="dstPortField" [6]="dateField" [7]="timeField")'

declare -A RPM_PARAMETERS_HASH='([timeField]="Time" [userField]="User-Name" [dstIPField]="" [srcIPField]="Source-IP-Address" [dstPortField]="Target-UDP-Port" [fUserField]="Full-Name" [dateField]="Date" [srcPortField]="Source-UDP-Port" )'

我实现了以下内容:

if [[  ${RPM_PARAMETERS_HASH[${USER_PARAMETERS_KEYS[j]}]} ]] ; then

问题

我的问题是当${USER_PARAMETERS_KEYS[j]} 变为等于dstIPField 时,因为它在关联数组中有一个空字符串值,所以尽管键在那里,但不满足 if 条件。

【问题讨论】:

    标签: arrays bash associative-array


    【解决方案1】:

    在 linuxhint 文章中:“Associative Arrays Bash 示例”1 在示例 #5 中显示:

    $ if [ ${ArrayName[searchKEY]+_} ]; then echo "Exists"; else echo "Not available"; fi
    

    请注意,“searchKEY”可以是文字值,也可以是扩展为文字值的变量。感谢这篇文章的作者,他在 shell 变量上发现了这个“+_”运算符,作为测试密钥存在的一种方式。我无法从 GNU BASH 参考手册2 中梳理出这一点。我确信它与参数扩展有关,但我从未意识到它会显示关联(散列) 数组成员存在。

    【讨论】:

      【解决方案2】:

      @sailnfool - 感谢您找到此解决方案。 “-v”解决方案对我不起作用。

      关于“+_” - 实际上“运算符”是“+”号,如"Shell Parameter Expansion" in the Bash Reference Manual 中所述:

      "${parameter:+word} 如果 parameter 为 null 或未设置,则不替换任何内容,否则替换 word 的扩展。"

      并且在介绍中:“省略冒号会导致仅对未设置的参数进行测试。”

      $ declare -A arr; arr["a"]="x"
      $ echo ${arr[a]+_}
      _
      $ echo ${arr[a]+1}
      1
      $ echo "|${arr[c]+1}|"
      ||
      $ arr["c"]=''
      $ [[ ${arr[c]+1} ]] && echo "ok" || echo "nok"
      ok
      $ [[ ${arr[c]:+1} ]] && echo "ok" || echo "nok"
      nok
      

      【讨论】:

        【解决方案3】:

        使用 bash,您可以只使用 -v 选项到 [[

        [[ -v RPM_PARAMETERS_HASH["${USER_PARAMETERS_KEYS[j]}"] ]]
        

        【讨论】:

        • 所以我改成这个if [[ -v RPM_PARAMETERS_HASH[${USER_PARAMETERS_KEYS[j]}] ]]; then 还是不满足if条件
        • 我无法复制,它可以工作,link to repl。 “仍然不满意”是什么意思?
        • ${USER_PARAMETERS_KEYS[j]} 计算为环境变量的名称时失败。
        • 当然 - 引用它。
        【解决方案4】:

        看起来您可以通过拆分步骤使其工作(首先评估密钥,然后使用-v 测试):

        declare -a USER_PARAMETERS_KEYS='([0]="userField" [1]="fUserField" [2]="srcIPField" [3]="srcPortField" [4]="dstIPField" [5]="dstPortField" [6]="dateField" [7]="timeField")'
        declare -A RPM_PARAMETERS_HASH='([timeField]="Time" [userField]="User-Name" [dstIPField]="" [srcIPField]="Source-IP-Address" [dstPortField]="Target-UDP-Port" [fUserField]="Full-Name" [dateField]="Date" [srcPortField]="Source-UDP-Port" )'
        
        j=4
        key=${USER_PARAMETERS_KEYS[j]}
        [[ -v RPM_PARAMETERS_HASH[$key] ]] && echo yes # output: yes
        

        【讨论】:

        • $key 计算为环境变量的名称时失败。
        猜你喜欢
        • 2017-09-05
        • 2018-02-24
        • 1970-01-01
        • 2012-08-02
        • 2015-10-09
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多