Combine a chave da matriz associativa com string ou endereço IP

Combine a chave da matriz associativa com string ou endereço IP

Estou tentando combinar uma chave de matriz associativa com uma string ou endereço IP. Eu segui seu script, mas recebo uma saída vazia.

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

Responder1

O ino loop foré oíndicedos elementos do array:

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

Se nome for uma variável de matriz, expande para a lista de índices de matriz (chaves) atribuídos em nome. Se o nome não for uma matriz, expande para 0 se o nome estiver definido e nulo caso contrário. Quando '@' é usado e a expansão aparece entre aspas duplas, cada chave se expande para uma palavra separada.

No seu caso:

[156.119.57.30]="156.119.57.31"

Você está comparando ovalorem vez disso, você pode ver melhor imprimindo as variáveis

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

Então, para comparar as chaves:

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

informação relacionada