
bc命令を使用して2つのIPアドレスを比較しようとしていますが、テストでは数字の小さいIPはキャプチャされません。
これは私のコードです。
TEST=$(echo "$i < $IP_BRD && $i > $IP_LOW " | bc -q )
TEST
結果が 1 の場合、プロセスは続行され、それ以外の場合は終了します。
以下の例を確認してください。
++ echo '191.35 < 187.254 && 191.35 > 184.1 '
+ TEST=0
++ echo '191.35 < 191.254 && 191.35 > 188.1 '
++ bc -q
+ TEST2=0
++ echo '191.35 < 195.254 && 191.35 > 192.1 '
++ bc -q
+ TEST3=0
+ [[ 0 = 1 ]]
+ [[ 0 = 1 ]]
+ [[ 0 = 1 ]]
ネットワークでは、echo '191.35 < 191.254 && 191.35 > 188.1 '
IP 191.35は191.254未満ですが、IPとは見なされません。
私はTEST=$(echo "$i < $IP_BRD && $i > $IP_LOW " | bc -q )
大きな成功を収めずに二重引用符を使ってみました。
それを修正する方法についてのアイデアはありますか?
答え1
echo '191.35 < 191.254 && 191.35 > 188.1 ' 行では、IP 191.35 は 191.254 未満ですが、そのままとは見なされません。
いいえ、そうではありません:191.35 == 191.350> 191.254。 bc は数値的に比較しますが、IP を直接比較することはできません。まず、IPを整数に変換する必要があります。その後、外部ツールを使用せずにシェル組み込み機能を使用して比較できます。
編集:このスレッドを確認してください。IPアドレスコンバータ
答え2
GNUツールチェーンがある場合は、一連の値で最も低い値を識別するために使用できますsort
。これはまた、191.35
例のような部分的なIPアドレスを扱うこともできます。187.254
printf "%s\0" 191.35 187.254 | sort -zV | head -zn 1 | tr -d '\0'
これをシェル関数に入れると、同一性テストを使用して2つのIPアドレスのうち低い方を識別できます。
# Return the lowest of a set of IP addresses
lowIP() {
printf "%s\0" "$@" | sort -zV | head -zn 1 | tr '\0' '\n'
}
# Sample session
try=191.35
if [[ $(lowIP "$try" 187.254) == "$try" ]]
then
echo "$try is the lower value"
else
echo "$try is not the lower value"
fi
答え3
bc
ここではこれを使用する必要はありません。シェルはIPv4アドレスのオクテットを処理できます。
(
IFS=.
read i1 i2 i3 i4 <<< "$i"
read b1 b2 b3 b4 <<< "$IP_BRD"
read l1 l2 l3 l4 <<< "$IP_LOW"
if [ "$i1" -le "$b1" -a "$i2" -le "$b2" -a "$i3" -le "$b3" -a "$i4" -lt "$b4" ] &&
[ "$l1" -le "$i1" -a "$l2" -le "$i2" -a "$l3" -le "$i3" -a "$l4" -lt "$i4" ]
then
echo success
else
echo failure
fi
)
もしあなたなら本物bc
数値を比較して次の形式の大きな説明を生成するには、次のようにします。if
if (a < b)
if (c < d)
# ...
1
今すぐ:
if [ "$(printf "if (%d <= %d) if (%d <= %d) if (%d <= %d) if (%d < %d) \n \
if (%d <= %d) if (%d <= %d) if (%d <= %d) if (%d < %d) 1\n" \
"$i1" "$b1" "$i2" "$b2" "$i3" "$b3" "$i4" "$b4" \
"$l1" "$i1" "$l2" "$i2" "$l3" "$i3" "$l4" "$i4" | bc)" = 1 ]
then
echo success
else
echo failure
fi