Проверить IP в тире (не Bash) - PullRequest
       48

Проверить IP в тире (не Bash)

0 голосов
/ 14 февраля 2012

Я пытаюсь проверить 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

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Вы можете построить оператор 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 (возвращающего либо true, либо false)как условие в выражении if.

Это немного строже, чем регулярное выражение, поскольку требует, чтобы каждый октет был меньше 256.

0 голосов
/ 23 июля 2014

Вот небольшая dash функция оболочки , которая не использует любые внешние команды и которая проверяет, является ли IPv4-адрес действительным.Он возвращает 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
0 голосов
/ 14 февраля 2012

Предполагая, что вы удовлетворены строкой проверки:

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

Обратите внимание, что она принимает недопустимые IP-адреса, такие как 876.3.4.5

Для проверки IP-адреса на самом деле не удобно использоватьрегулярное выражение.Относительно легко сделать это:

IFS=. read a b c d << EOF
$ip
EOF

if ( for i in a b c d; do
        eval test \$$i -gt 0 && eval test \$$i -le 255 || exit 1
    done 2> /dev/null )
then
    echo $ip is valid
fi
...