21

我有一小段代码可以检查 IP 地址的有效性:

function valid_ip()
{
    local  ip=$1
    local  stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]; then
            stat=1
        else
            stat=0
        fi
    fi
    return $stat
}

但我在 bash 条件句中使用它时遇到问题。我尝试了许多技术来测试它的返回值,但大多数都失败了。

if [[ !$(valid_ip $IP) ]]; then

if [[ $(valid_ip IP) -eq 1 ]]; then

等等等等。谁能建议我应该在这里做什么?

编辑

按照你的建议,我使用了类似的东西:

  if valid_ip "$IP" ; then
      ... do stuff
  else
      perr "IP: \"$IP\" is not a valid IP address"
  fi

我得到像这样的错误

IP:“10.9.205.228”不是有效的 IP 地址

4

2 回答 2

19

$?命令退出后,返回码在特殊参数中可用。通常,您只需要在运行另一个命令之前保存它的值时使用它:

valid_ip "$IP1"
status1=$?
valid_ip "$IP2"
if [ $status1 -eq 0 ] || [ $? -eq 0 ]; then

或者如果您需要区分各种非零状态:

valid_ip "$IP"
case $? in
    1) echo valid_IP failed because of foo ;;
    2) echo valid_IP failed because of bar ;;
    0) echo Success ;;
esac

否则,您让各种操作员隐式检查它:

if valid_ip "$IP"; then
    echo "OK"
fi

valid_IP "$IP" && echo "OK"

这是一种简单、惯用的写作方式valid_ip

valid_ip () {
    local ip=$1
    [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && {
        IFS='.' read a b c d <<< "$ip"
        (( a < 255 && b < 255 && c < 255 && d << 255 ))
    }
}

有两个表达式,the[[...]]和 the { ... }; 两者由 加入&&。如果第一个失败,那么valid_ip失败。如果成功,则计算第二个表达式(复合语句)。将read字符串拆分为四个变量,每个变量在算术表达式中分别进行测试。如果全部为真,则((...))成功,即&&列表成功,即valid_ip成功。无需存储或返回显式返回码。

于 2013-07-10T14:39:35.420 回答
12

如果检查退出状态,则不需要括号:

if valid_ip $IP ; then
    ...

只需以调用任何其他命令的方式调用该函数。

于 2013-07-10T14:30:12.403 回答