0

我正在尝试在破折号脚本中验证 IP 地址。我已经找到了很多方法来实现与 bash 相同的功能,例如在linuxjournal

基本上所做的是使用这个进行比较:

if [[ $ip =~ '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ]]; then
  do something
fi

有没有办法用破折号得到同样的结果?

更新:这是完成我需要的最终脚本:

#In case RANGE is a network range (cidr notation) it's splitted to every ip from 
# that range, otherwise we just keep the ip
if echo $RANGE | grep -E -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$'; then
    IPS=`prips $RANGE -e ...0,255`
    if [ "$?" != "0" ] ; then
        echo "ERROR: Not a valid network range!"
        exit 1
    fi
elif echo $RANGE | grep -E -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then
    IPS="$RANGE"
else
    echo "$RANGE no is not a valid IP address or network range"
    exit 1
fi
4

3 回答 3

1

您可以构建一个case语句,尽管它比正则表达式更冗长。另一方面,您避免产生任何外部进程,并且它可能更易于阅读和维护以启动。

if case $ip in
    # Invalid if it contains any character other than number or dot
    # Invalid if it contains more than three dots
    # Invalid if it contains two adjacent dots
    # Invalid if it begins with a non-number
    # Invalid if it ends with a non-number
    *[!.0-9]* | *.*.*.*.* | *..* | [!0-9]* | *[!0-9] ) false ;;
    # Invalid if it contains a number bigger than 255:
    #  256-259 or 260-299 or 300-999 or four adjacent digits
    *25[6-9]* | *2[6-9][0-9]* | *[3-9][0-9][0-9]* | *[0-9][0-9][0-9][0-9]* ) false;;
    # Verify that it contains three dots
    *.*.*.* ) true ;;
    # Failing that, invalid after all (too few dots)
    *) false ;;
esac; then
    echo "$ip" is valid
fi

case请注意将语句(返回真或假)用作语句中的条件的时髦用法if

这比正则表达式稍微严格,因为它要求每个八位字节小于 256。

于 2012-02-14T12:21:49.727 回答
0

假设您对验证字符串感到满意:

$ s='[0-9]\{1,3\}'
$ 回声 $ip | grep > /dev/null "^$s\.$s\.$s\.$s$" &&
  echo $ip 有效

请注意,这接受无效的 IP 地址,如 876.3.4.5

要验证一个ip,使用正则表达式真的很不方便。一个相对容易的事情是:

国际金融服务公司=。读 abcd << EOF
$ip
EOF

if ( for i in abcd; do
        评估测试 \$$i -gt 0 && 评估测试 \$$i -le 255 || 1号出口
    完成 2> /dev/null )
然后
    echo $ip 有效
菲
于 2012-02-14T11:20:12.167 回答
0

这是一个不使用任何外部命令并检查 IPv4 地址是否有效的小型dashshell 函数。如果地址格式正确,则返回 true,否则返回 false。

我试图在我的评论中解释魔法。

valid_ip() {
    local IP="$1" IFS="." PART           # make vars local, get arg, set $IFS
    set -- $IP                           # split on $IFS, set $1, $2 etc.
    [ "$#" != 4 ] && return 1            # BAD: if not 4 parts
    for PART; do                         # loop over $1, $2 etc.
        case "$PART" in
            *[!0-9]*) return 1           #   BAD: if $PART contains non-digit
        esac
        [ "$PART" -gt 255 ] && return 1  #   BAD: if $PART > 255
    done
    return 0                             # GOOD: nothing bad found
}

使用此功能,您可以测试您的 IP 地址,例如,如果 IP 地址无效,则中止您的脚本:

if valid_ip "$IP"; then
    echo "ERROR: IP address '$IP' is invalid" >&2
    exit 4
fi
于 2014-07-22T23:49:46.263 回答