문자열 또는 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
i
for 루프 의은색인배열 요소 중:
${!이름[@]}
${!이름[*]}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