連想配列のキーを文字列または 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 が配列でない場合、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