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