bc를 사용하여 두 IP 주소 비교

bc를 사용하여 두 IP 주소 비교

bc 명령어를 이용하여 두 개의 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'

이것을 쉘 함수에 넣으면 동일성 테스트를 사용하여 두 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

관련 정보