연관 배열 키를 문자열 또는 IP 주소와 일치시킵니다.

연관 배열 키를 문자열 또는 IP 주소와 일치시킵니다.

문자열 또는 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

ifor 루프에서~이다색인배열의 요소:

${!이름[@]}
${!이름[*]}

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

관련 정보