Haga coincidir la clave de matriz asociativa con una cadena o dirección IP

Haga coincidir la clave de matriz asociativa con una cadena o dirección IP

Estoy intentando hacer coincidir una clave de matriz asociativa con una cadena o dirección IP. Seguí tu script pero obtengo un resultado vacío.

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

Respuesta1

El ien el bucle fores elíndicede los elementos de la matriz:

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

Si el nombre es una variable de matriz, se expande a la lista de índices de matriz (claves) asignados en el nombre. Si el nombre no es una matriz, se expande a 0 si el nombre está establecido y a nulo en caso contrario. Cuando se utiliza '@' y la expansión aparece entre comillas dobles, cada clave se expande a una palabra separada.

En tu caso:

[156.119.57.30]="156.119.57.31"

Estas comparando elvaloren cambio, puedes verlo mejor imprimiendo las variables.

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

Entonces para comparar las claves:

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

información relacionada