我正在尝试将关联数组键与字符串或 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 不是数组,则在设置 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