Bash:检查键是否在关联数组中

问题描述 投票:0回答:2

目标:

我要做的就是检查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
2个回答
1
投票

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

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

0
投票

看来您可以通过拆分步骤来工作(首先评估密钥,然后使用-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
© www.soinside.com 2019 - 2024. All rights reserved.