bcを使用した2つのIPアドレスの比較

bcを使用した2つのIPアドレスの比較

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

関連情報