【问题标题】:Comparing two IP Addresses in Bash在 Bash 中比较两个 IP 地址
【发布时间】:2014-07-30 18:06:48
【问题描述】:

我正在尝试查找两个 IP 地址是否相同。我承认我是 bash 的新手,但我认为这没有任何原因:

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

出于测试目的,我什至对这两个变量的值进行了硬编码,但它们仍然显示不一样。我知道您并不总是看到自己的拼写错误,但我不明白为什么这不起作用。有什么想法吗?

【问题讨论】:

  • 请告诉我们$IPAddress$OLDIPAddress是如何定义的。
  • 这两个值是什么?甚至是测试的。如果将它们都发送到xxdhexdump,你会得到什么?
  • 这取决于您所说的“相同”......“127.0.0.1”与“127.000.000.001”“相同”吗?如果是这样,那么简单的文本比较将是不够的......
  • @twalberg 八进制定义真的很少见。这不太可能是原因,但是,嘿!还是好点! :)
  • @hek2mgl 不一定会考虑八进制,尽管这也是一个有效的观察结果......我更多的是考虑一个基于表单的条目,它可能会返回相当于例如printf "%03d" x 对于每个八位字节...永远不要相信输入....

标签: bash ubuntu ip-address


【解决方案1】:

虽然您的命令应该可以工作,但您可以使用简单的测试运算符(只是一个括号)。优点是它适用于任何(POSIX)shell。但是,[[ 运算符也应该可以工作。

你能重现这个小例子吗? (应该输出'yes'):

IPAddress="127.0.0.1"
OLDIPAddress="127.0.0.1"

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

【讨论】:

  • 这大致就是我进行测试的方式。我得到的结果是这两个 IP 地址不一样,尽管它们显然是一样的。由于我无法理解的原因,此示例返回的结果不一样...
  • 您是否复制/粘贴了我的代码并尝试过?没有任何更改?
  • 是的。复制粘贴,我唯一做的就是在顶部添加一个#!/bin/bash。
【解决方案2】:

用于比较不同格式 IP 地址的快速演示脚本,例如“正常”与 DHCP 总是 3 位八位字节。希望除了比较之外,您还可以使用一些有用的技巧进行解析和验证,并成为社区更多人的催化剂。 (这是我第一篇有代码的帖子,所以希望它可以顺利通过 - 和 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
$

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 2021-01-10
    • 1970-01-01
    • 2012-08-26
    • 2010-11-04
    • 2013-06-29
    • 1970-01-01
    • 2021-12-01
    • 2014-08-04
    相关资源
    最近更新 更多