連想配列キーを文字列または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 設定時に 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

おすすめ記事