Сравнение двух IP-адресов в Bash

Я пытаюсь найти, если два IP-адреса одинаковы или нет. Я признаю, что я новичок в bash, но я не вижу причин, чтобы это не сработало:

if [[ "$IPAddress" != "$OLDIPAddress" ]] then echo "IP Not the Same" else echo "IP Same" fi 

В целях тестирования я даже жестко закодировал значения для двух переменных, и они по-прежнему не отображаются одинаково. Я знаю, что вы не всегда видите свои опечатки, но я не понимаю, почему это не сработает. Есть идеи?

    В то время как ваша команда должна работать, вы можете использовать простой тестовый оператор (только одну скобку). Преимущество состоит в том, что он будет работать с любой (POSIX) оболочкой. Однако [[ оператор должен работать тоже.

    Можете ли вы воспроизвести этот маленький пример? (Должен выводить «да»):

     IPAddress="127.0.0.1" OLDIPAddress="127.0.0.1" if [ "$IPAddress" != "$OLDIPAddress" ] ; then echo "no" else echo "yes" fi 

    Быстрый демонстрационный скрипт для сравнения по-разному сформированных IP-адресов, «нормальный» и DHCP, например, 3-разрядные октеты. Надеюсь, несколько полезных трюков, которые вы можете использовать для синтаксического анализа и проверки в дополнение к сравнению, и катализатор для некоторых из сообщества. (Это мой первый пост с кодом, поэтому, надеюсь, он проходит через ok – как всегда YMMV.)

     #!/bin/bash # demo.sh - parse, validate, compare ip addresses # usage: demo.sh {ipaddress1} {ipaddress2} #--- IP ADDRESS 1 #--- Is there anything besides digits and three dots? #--- Parse out the octets #--- There should be exactly 4 populated octets #--- All 4 octets must not be > 255 [ "${1//[0-9]/}" != '...' ] && echo "invalid" && exit 1 O1=(${1//./ }) [ -z "${O1[3]}" -o -n "${O1[4]}" ] && echo "invalid" && exit 1 [ ${O1[0]} -gt 255 -o ${O1[1]} -gt 255 -o ${O1[2]} -gt 255 -o ${O1[3]} -gt 255 ] && echo "invalid" && exit 1 #--- IP ADDRESS 2 [ "${2//[0-9]/}" != '...' ] && echo "invalid" && exit 1 O2=(${2//./ }) [ -z "${O2[3]}" -o -n "${O2[4]}" ] && echo "invalid" && exit 1 [ ${O2[0]} -gt 255 -o ${O2[1]} -gt 255 -o ${O2[2]} -gt 255 -o ${O2[3]} -gt 255 ] && echo "invalid" && exit 1 #--- Numeric compares of each octet echo "Comparing each octect" if [ ${O1[0]} -eq ${O2[0]} ] then echo " ${O1[0]} == ${O2[0]}" else echo " ${O1[0]} != ${O2[0]}" fi if [ ${O1[1]} -eq ${O2[1]} ] then echo " ${O1[1]} == ${O2[1]}" else echo " ${O1[1]} != ${O2[1]}" fi if [ ${O1[2]} -eq ${O2[2]} ] then echo " ${O1[2]} == ${O2[2]}" else echo " ${O1[2]} != ${O2[2]}" fi if [ ${O1[3]} -eq ${O2[3]} ] then echo " ${O1[3]} == ${O2[3]}" else echo " ${O1[3]} != ${O2[3]}" fi #--- Numeric IP address compare echo "Compare via long if" if [ ${O1[0]} -eq ${O2[0]} -a ${O1[1]} -eq ${O2[1]} -a ${O1[2]} -eq ${O2[2]} -a ${O1[3]} -eq ${O2[3]} ] then echo " ${1} == ${2}" else echo " ${1} != ${2}" fi #--- Loop for numeric compare echo "Compare via loop" SAME="Y" for I in 0 1 2 3 do echo " loop ${I} compare ${O1[$I]} ${O2[$I]}" [ ${O1[$I]} -ne ${O2[$I]} ] && SAME="" && break done echo " result" if [ -n "${SAME}" ] then echo " ${1} == ${2}" else echo " ${1} != ${2}" fi exit $ ./demo.sh 1.2.3.4 1.2.3 invalid $ ./demo.sh 1.2.3.4 1.2.q.4 invalid $ ./demo.sh 1.2.3.4 1.2.3.4. invalid $ ./demo.sh 1.2.3.4 1.2.3.4.5 invalid $ ./demo.sh 1.2.3.4 1.2.300.4 invalid $ ./demo.sh 1.02.3.004 01.2.003.4 Comparing each octect 1 == 01 02 == 2 3 == 003 004 == 4 Compare via long if 1.02.3.004 == 01.2.003.4 Compare via loop loop 0 compare 1 01 loop 1 compare 02 2 loop 2 compare 3 003 loop 3 compare 004 4 result 1.02.3.004 == 01.2.003.4 $ ./demo.sh 1.02.3.004 01.2.030.4 Comparing each octect 1 == 01 02 == 2 3 != 030 004 == 4 Compare via long if 1.02.3.004 != 01.2.030.4 Compare via loop loop 0 compare 1 01 loop 1 compare 02 2 loop 2 compare 3 030 result 1.02.3.004 != 01.2.030.4 $