Всем добрый день.
Есть скрипт, назовем его check.sh. Скрипт писан на Bash 3.2.25
В скрипте есть перемененная, куда заносится IP адресс($1)
Как можно организовать проверку правильности ввода? Т.е. правильность ввода IPV4 адреса?
Крайний вариант - проверка каждого символа циклом =) Но это долго, и я уверен, есть варианты проще.
Буду благодарен за любой совет.
>Всем добрый день.
>Есть скрипт, назовем его check.sh. Скрипт писан на Bash 3.2.25
>В скрипте есть перемененная, куда заносится IP адресс($1)
>Как можно организовать проверку правильности ввода? Т.е. правильность ввода IPV4 адреса?
>Крайний вариант - проверка каждого символа циклом =) Но это долго, и
>я уверен, есть варианты проще.
>
> Буду благодарен за любой
>совет.любитель баша? ну скорми тогда его grep
#!/bin/sh#проверяет аргуемент является ли он ip адресом. ./check_ip "аргумент возможно ip адрес"
#на самом деле проверяется только формат(значения не проверяются) можно прверить конечно и #значения :)
#check ip : 'aww10.4.0.101w'
#Valid IP 10.4.0.101
ip=$1
echo "check ip : '$ip'"
ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`if ! [ ${ip}_ == _ ] ; then
echo "Valid IP $ip"
else
echo "Bad IP $ip"
fi
>[оверквотинг удален]
>#Valid IP 10.4.0.101
>ip=$1
>echo "check ip : '$ip'"
>ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`
>
>if ! [ ${ip}_ == _ ] ; then
> echo "Valid IP $ip"
>else
> echo "Bad IP $ip"
>fiОгромное спасибо ) Как делать - уловил, в остальном будут разбиратся )
>echo "check ip : '$ip'"
>ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`Ню-ню :) По вашему 444.555.666.777 - валидный адрес?
А как вообще определить валидный адрес? Если хорошенько задумаетесь над этой проблемой, то поймете что она не решаема в общем виде. Как следсвтие полноценная проверка невозможна и на практике довольствуются частичными критериями, которые определить может лишь постановщик задачи. Так как автор не потрудился изложить свои критерии, то ему был предложен вариант с минимальной проверкой.
>>echo "check ip : '$ip'"
>>ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`
>
>Ню-ню :) По вашему 444.555.666.777 - валидный адрес?у меня противоположный пример ))
10
192.168))
>>echo "check ip : '$ip'"
>>ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`
>
>Ню-ню :) По вашему 444.555.666.777 - валидный адрес?данный регэксп проверяет только форму адреса, и не проверяет значения байт.
на самом деле в регэкспе есть другая ошибка.
неправильно проходил проверку адрес
./1.sh 1110.240.1011.254
check ip : '1110.240.1011.254'
Valid IP 1110.240.101
исправляется просто:
ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}"`но может быть вы предложите свое правильное решение?
более полное
>но может быть вы предложите свое правильное решение?
>более полноеДа, кому оно надо-то?! :)))
...
http:/openforum/vsluhforumID12/5394.html#9
Да, в моём варианте диапазон 256-299 "пролезает". А ещё октеты, начинающиеся с 0 и длиннее 1 символа, тож не "отсеиваются"....perl
if ($string=~/^[01]?\d\d|2[0-4]\d|25[0-5])\.[01]?\d\d|2[0-4]\d|25[0-5])\.[01]?\d\d|2[0-4]\d|25[0-5])\.[01]?\d\d|2[0-4]\d|25[0-5])$/) { }
https://www.opennet.ru/docs/RUS/perl_help/perl_help-perl.html.gz...awk
awk -F '[.]' 'function ok(n) { >>>и далее= https://www.opennet.ru/tips/info/1811.shtml
>...perl
>if ($string=~/^[01]?\d\d|2[0-4]\d|25[0-5])\.[01]?\d\d|2[0-4]\d|25[0-5])\.[01]?\d\d|2[0-4]\d|25[0-5])\.[01]?\d\d|2[0-4]\d|25[0-5])$/) { }
>https://www.opennet.ru/docs/RUS/perl_help/perl_help-perl.html.gz
>
>...awk
>awk -F '[.]' 'function ok(n) { >>>и далее= https://www.opennet.ru/tips/info/1811.shtmlне-не, это лишнее, регэксп усложнять не надо, надо просто извлечь части(значения октетов)и проверить их на величину от 0 до 255.
>надо просто извлечь части(значения октетов)и проверить их на величину от 0 до 255.То есть по второй ссылке Вы не "ходили" и хотите это обсудить? B-)
На самом баше, оно, конечно, тоже можно... но получится ещё длиннее и уродливее. Без хотя бы grep -o -- так вообще ужас.
>>Как можно организовать проверку правильности ввода?:) В "постановке" не было задачи "выковыривать"...
>#значения :)
>#check ip : 'aww10.4.0.101w'#Bad IP aww10.4.0.101w
#check ip : '10.4.0.101'
#Valid IP 10.4.0.101>ip=$1
>echo "check ip : '$ip'"#"Учись, студент!"(с)
oct="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])">ip=`echo $ip | grep -o -e "[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}"`
# ..."космические корабли бороздят просторы Большого театра"...
ip2="`echo "$ip"|egrep -o "^$oct\.$oct\.$oct\.$oct$"`">if ! [ ${ip}_ == _ ] ; then
> echo "Valid IP $ip"
>else
> echo "Bad IP $ip"
>fi[ "$ip" = "$ip2" ] && echo "Valid IP $ip" || echo "Bad IP $ip"
...
или даже
echo "$ip"|egrep -qs "^$oct\.$oct\.$oct\.$oct$" >/dev/null \
&& echo Da! || echo Net...
>Всем добрый день.
>Есть скрипт, назовем его check.sh. Скрипт писан на Bash 3.2.25
>В скрипте есть перемененная, куда заносится IP адресс($1)
>Как можно организовать проверку правильности ввода? Т.е. правильность ввода IPV4 адреса?
>Крайний вариант - проверка каждого символа циклом =) Но это долго, и
>я уверен, есть варианты проще.
>
> Буду благодарен за любой
>совет.Chisto bash :)
check_ip4() {
IFS="."
arr=($1)
if [ ${#arr[@]} -ne 4 ]; then
return 0
else
for octet in ${arr[@]}; do
if [ $octet -lt 0 -o $octet -gt 255 ]; then
return 0
fi
done
fi
return 1
}Usage:
ip=12.23.34.45
if check_ip4 $ip; then
echo "ip=$ip is NOT valid"
else
echo "ip=$ip is VALID"
fi--- Sas
>[оверквотинг удален]
>
>ip=12.23.34.45
>if check_ip4 $ip; then
> echo "ip=$ip is NOT valid"
>else
> echo "ip=$ip is VALID"
>fi
>
>
>--- SasSmall improvement to check only for numeric octets
check_ip4() {
IFS="."
arr=($1)
if [ ${#arr[@]} -ne 4 ]; then
return 0
else
for octet in ${arr[@]}; do
if ! $(($octet-$octet)) >/dev/null 2>&1; then
return 0
fi
if [ $octet -lt 0 -o $octet -gt 255 ]; then
return 0
fi
done
fi
return 1
}--- Sas
>[оверквотинг удален]
> return 0
> fi
> done
> fi
> return 1
>}
>
>
I was pointed out that check for number was not good...
check_ip4() {
IFS="."
arr=($1)
if [ ${#arr[@]} -ne 4 ]; then
return 0
else
for octet in ${arr[@]}; do
if ! [[ $octet =~ "^[0-9]*$" ]]; then
return 0
fi
let octet+=0
if [[ $octet -lt 0 ]] || [[ $octet -gt 255 ]]; then
return 0
fi
done
fi
return 1
}
--- Sas
>>if ! $(($octet-$octet)) >/dev/null 2>&1; then
>>[оверквотинг удален]
>I was pointed out that check for number was not good...Ага :) , "крайние" значения нужно учитывать. Долго думал, чего не так |-) , наконец сообразил - нуль "не пролезает".
> if ! [[ $octet =~ "^[0-9]*$"
Баши-и-изм. $))) Проверка на числовое значение ~~
if [ "$((octet+0)) != "$octet" ]И кстати, да, тогда уж сразу --
# студент бороздит просторы Большого театра
oct="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
check_ip4() { [ "$1" =~ "^$oct\.$oct\.$oct\.$oct$" ]; }Гм, неужели мы родили "Истину"? :-))))
С пополнением!..
>> if ! [[ $octet =~ "^[0-9]*$"
>Баши-и-изм. $))) Проверка на числовое значение ~~
>if [ "$((octet+0)) != "$octet" ]Вот из ABS-а ещё... _не_ одна %)) ... реализация:
isdigit () # Tests whether *entire string* is numerical.
{ # In other words, tests for integer variable.
[ $# -eq 1 ] || return $FAILURE
case $1 in
*[!0-9]*|"") return $FAILURE;;
*) return $SUCCESS;;
esac
}# This function described in is_number.bash.
# is_number <input>
is_number() {
[ "$#" -eq 1 ] || return 1 # is blank?
[ x"$1" == 'x0' ] && return 0 # is zero?
local -i tst
let tst=$1 2>/dev/null # else is numeric!
return $?
}Ужос! Взлрослые дядьки... Нет, чтоб програмированием заниматься - выкабениваются перед студентом. $*)
Взяв из вышенаписанного самое необходимое, для себя определил вот такую ф-цию:#!/bin/bash
checkip(){
IFS="."
arr=($1)
echo "Кол-во элементов в массиве ${#arr[@]}"
i=0
if [ ${#arr[@]} -ne 4 ]; then
return 0
elsefor octet in ${arr[@]}; do
case $octet in
*[!0-9]*|"") return 0;;
esacif [ $i == 0 ]; then
case $octet in
"255"|"") return 0;;
"0"|"") return 0;;
esac
fiif [ $i == 3 ]; then
case $octet in
"255"|"") return 0;;
"0"|"") return 0;;
esac
fiif [ $i == 1 ]; then
case $octet in
"255"|"") return 0;;
esac
fiif [ $i == 2 ]; then
case $octet in
"255"|"") return 0;;
esac
fiif [ $octet -lt 0 -o $octet -gt 255 ]; then
return 0
filet i=i+1
done
fireturn 1
}
IFS1=" "
while [ $? != 1 ]; do
IFS=$IFS1
echo "Введиете IP адрес: "
read cip
checkip $cip
done