將關聯數組鍵與字串或 IP 位址匹配

將關聯數組鍵與字串或 IP 位址匹配

我正在嘗試將關聯數組鍵與字串或 IP 位址進行匹配。我按照你的腳本操作,但得到空輸出。

declare -A assArray1=( [156.119.57.30]="156.119.57.31" [156.119.57.10]="156.119.57.11" [156.119.57.21]="156.119.57.22" )
keys=()

IPADDR=$(ip addr show |grep 'eth0'|grep -v 127.0.0.1 |awk '{print $2}'| cut -d/ -f1 | cut -d':' -f2)
#Example IPADDR=156.119.57.10
for i in "${!assArray1[@]}";do
 if [[ ${assArray1[$i]} == "$IPADDR" ]]; then
   keys+=( "$i" )
 fi
done

echo ${keys[@]} #output should be  156.119.57.10

答案1

ifor迴圈中的是個指數數組的元素:

${!name[@]}
${!名[*]}

如果 name 是數組變量,則擴展到 name 中分配的數組索引(鍵)列表。如果 name 不是數組,則在設定 name 時擴展為 0,否則擴展為 null。當使用“@”並且擴展出現在雙引號內時,每個鍵都會擴展為單獨的單字。

在你的情況下:

[156.119.57.30]="156.119.57.31"

您正在比較價值相反,你可以看到它更好地打印變量

$ for i in "${!assArray1[@]}"; do
    echo "${assArray1[$i]}"
  done
156.119.57.11
156.119.57.31
156.119.57.22

因此,要比較密鑰:

$ for i in "${!assArray1[@]}"; do
    if [[ "$i" = "$IPADDR" ]]; then
      keys+=( "$i" )
    fi
  done
$ echo "${keys[@]}"
156.119.57.10

相關內容