The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Не могу разобратся с Bash скриптом, crestfallen (ok), 20-Дек-08, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


11. "Не могу разобратся с Bash скриптом"  +/
Сообщение от sasemail (??), 23-Дек-08, 02:09 
>Всем добрый день.
>Есть скрипт, назовем его 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

Ответить | Правка | Наверх | Cообщить модератору

12. "Не могу разобратся с Bash скриптом"  +/
Сообщение от sasemail (??), 23-Дек-08, 02:27 
>[оверквотинг удален]
>
 
>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

Ответить | Правка | Наверх | Cообщить модератору

13. "Не могу разобратся с Bash скриптом"  +/
Сообщение от sasemail (??), 23-Дек-08, 03:06 
>[оверквотинг удален]
>        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

Ответить | Правка | Наверх | Cообщить модератору

14. "Bash скриптом - когда ж он кончится-то :-D"  +/
Сообщение от Andrey Mitrofanov (?), 23-Дек-08, 10:42 
>>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$" ]; }

Гм, неужели мы родили "Истину"? :-))))
С пополнением!..

Ответить | Правка | Наверх | Cообщить модератору

15. "гы, какая интересная теема - никак не кончится"  +/
Сообщение от Andrey Mitrofanov (?), 23-Дек-08, 11:11 
>>      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 $?
}

Ужос! Взлрослые дядьки... Нет, чтоб програмированием заниматься - выкабениваются перед студентом. $*)

Ответить | Правка | Наверх | Cообщить модератору

16. "ip - как много в этом звуке"  +/
Сообщение от Zenithemail (?), 07-Июн-12, 23:45 
Взяв из вышенаписанного самое необходимое, для себя определил вот такую ф-цию:

#!/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

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру