- Не могу разобратся с Bash скриптом,
NuINu, 14:57 , 20-Дек-08 (1)>Всем добрый день. >Есть скрипт, назовем его 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
- Не могу разобратся с Bash скриптом,
crestfallen, 15:29 , 20-Дек-08 (2)>[оверквотинг удален] >#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 Огромное спасибо ) Как делать - уловил, в остальном будут разбиратся ) - Не могу разобратся с Bash скриптом,
Bober, 04:00 , 22-Дек-08 (3)>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 - валидный адрес?
- Не могу разобратся с Bash скриптом,
angra, 07:03 , 22-Дек-08 (4)А как вообще определить валидный адрес? Если хорошенько задумаетесь над этой проблемой, то поймете что она не решаема в общем виде. Как следсвтие полноценная проверка невозможна и на практике довольствуются частичными критериями, которые определить может лишь постановщик задачи. Так как автор не потрудился изложить свои критерии, то ему был предложен вариант с минимальной проверкой.
- Не могу разобратся с Bash скриптом,
Pahanivo, 08:14 , 22-Дек-08 (5)>>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 ))
- Не могу разобратся с Bash скриптом,
NuINu, 10:17 , 22-Дек-08 (6)>>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\}"` но может быть вы предложите свое правильное решение? более полное
- а давайте все писать ненужные _нам_ скрипты,
Andrey Mitrofanov, 10:37 , 22-Дек-08 (7)
- а давайте все писать ненужные _нам_ скрипты,
NuINu, 10:43 , 22-Дек-08 (8)
- я ж говорю, ненужные скрипты,
Andrey Mitrofanov, 18:45 , 22-Дек-08 (10)>надо просто извлечь части(значения октетов)и проверить их на величину от 0 до 255. То есть по второй ссылке Вы не "ходили" и хотите это обсудить? B-) На самом баше, оно, конечно, тоже можно... но получится ещё длиннее и уродливее. Без хотя бы grep -o -- так вообще ужас.
- продолжим бесполезные $) упражнения...,
Andrey Mitrofanov, 11:05 , 22-Дек-08 (9)>>Как можно организовать проверку правильности ввода? :) В "постановке" не было задачи "выковыривать"... >#значения :) >#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...
- Не могу разобратся с Bash скриптом,
sas, 02:09 , 23-Дек-08 (11)>Всем добрый день. >Есть скрипт, назовем его 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
- Не могу разобратся с Bash скриптом,
sas, 02:27 , 23-Дек-08 (12)>[оверквотинг удален] > >ip=12.23.34.45 >if check_ip4 $ip; then > echo "ip=$ip is NOT valid" >else > echo "ip=$ip is VALID" >fi > > >--- Sas Small 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
- Не могу разобратся с Bash скриптом,
sas, 03:06 , 23-Дек-08 (13)>[оверквотинг удален] > return 0 > fi > done > fi > return 1 >} > > > >--- Sas 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
- Bash скриптом - когда ж он кончится-то :-D,
Andrey Mitrofanov, 10:42 , 23-Дек-08 (14)>>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$" ]; } Гм, неужели мы родили "Истину"? :-)))) С пополнением!..
- гы, какая интересная теема - никак не кончится,
Andrey Mitrofanov, 11:11 , 23-Дек-08 (15)>> 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 $? } Ужос! Взлрослые дядьки... Нет, чтоб програмированием заниматься - выкабениваются перед студентом. $*)
- ip - как много в этом звуке,
Zenith, 23:45 , 07-Июн-12 (16)Взяв из вышенаписанного самое необходимое, для себя определил вот такую ф-цию:#!/bin/bash checkip(){ IFS="." arr=($1) echo "Кол-во элементов в массиве ${#arr[@]}" i=0 if [ ${#arr[@]} -ne 4 ]; then return 0 else for octet in ${arr[@]}; do case $octet in *[!0-9]*|"") return 0;; esac if [ $i == 0 ]; then case $octet in "255"|"") return 0;; "0"|"") return 0;; esac fi if [ $i == 3 ]; then case $octet in "255"|"") return 0;; "0"|"") return 0;; esac fi if [ $i == 1 ]; then case $octet in "255"|"") return 0;; esac fi if [ $i == 2 ]; then case $octet in "255"|"") return 0;; esac fi if [ $octet -lt 0 -o $octet -gt 255 ]; then return 0 fi let i=i+1 done fi return 1 } IFS1=" " while [ $? != 1 ]; do IFS=$IFS1 echo "Введиете IP адрес: " read cip checkip $cip done
|