Assoziativen Array-Schlüssel mit Zeichenfolge oder IP-Adresse abgleichen

Assoziativen Array-Schlüssel mit Zeichenfolge oder IP-Adresse abgleichen

Ich versuche, einen assoziativen Array-Schlüssel mit einer Zeichenfolge oder IP-Adresse abzugleichen. Ich bin Ihrem Skript gefolgt, erhalte aber eine leere Ausgabe.

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

Antwort1

Die iin der for-Schleifeist derIndexder Elemente des Arrays:

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

Wenn Name eine Array-Variable ist, wird die Liste der Array-Indizes (Schlüssel) erweitert, die in Name zugewiesen sind. Wenn Name kein Array ist, wird die Liste auf 0 erweitert, wenn Name festgelegt ist, andernfalls auf null. Wenn „@“ verwendet wird und die Erweiterung in doppelten Anführungszeichen steht, wird jeder Schlüssel zu einem separaten Wort erweitert.

In Ihrem Fall:

[156.119.57.30]="156.119.57.31"

Sie vergleichen dieWertStattdessen können Sie es besser sehen, indem Sie die Variablen drucken

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

Um die Schlüssel zu vergleichen:

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

verwandte Informationen