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 i
no 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