Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Проверка сложного условия в bash-скрипте  (Прочитано 6302 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Ururu_2

  • Автор темы
  • Активист
  • *
  • Сообщений: 290
    • Просмотр профиля
Всего-то и надо - проверить, входит ли переменная в диапазон. Но я заколебался уже! Ни в одном руководстве толком не написано, везде условия проверяются единичные. Я пробовал так:

if [["$kanal"<1000 || "$kanal">999999]]; then
  echo "Неправильный номер канала. Номер канала может быть длиной от 4 до 6 цифр.";
  exit 1;
fi

И так:

if [[$kanal<1000 || $kanal>999999]]; then
  echo "Неправильный номер канала. Номер канала может быть длиной от 4 до 6 цифр.";
  exit 1;
fi

и так

if ("$kanal"<1000) || ("$kanal">999999); then
  echo "Неправильный номер канала. Номер канала может быть длиной от 4 до 6 цифр.";
  exit 1;
fi

И как уже только не пробовал - бесполезно! пишет:

Цитировать
./script: строка 8: 1000: Нет такого файла или каталога
./script: строка 8: 90802: команда не найдена

Как задать условие, чтобы bash понял?

З.Ы. И как проверить, что переменная содержит только цифры, и там нет букв и пробелов?

Оффлайн dieselist

  • Активист
  • *
  • Сообщений: 525
    • Просмотр профиля
    • diesel.pp.ua
Re: Проверка сложного условия в bash-скрипте
« Ответ #1 : 05 Январь 2011, 00:55:17 »
По первому вопросу ИМХО, логичнее было бы использовать case, хотя и через if это все-таки реализовать можно...

death diesel # digit="6"
case $digit in [1-3]) echo 1;; [3-7]) echo 2;; *) echo 3;; esac
2

по второму можно немного поизвращаться :)

death diesel # digit="7"
death diesel # if [ $digit = "$(echo $digit | awk '{print strtonum($0)}')" ]; then echo "digit"; else echo "not digit"; fi
digit
death diesel # digit="string"
death diesel # if [ $digit = "$(echo $digit | awk '{print strtonum($0)}')" ]; then echo "digit"; else echo "not digit"; fi
not digit
Ubuntu, Gentoo, RHEL, AIX

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #2 : 05 Январь 2011, 04:27:31 »
if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then
  echo "Неправильный номер канала. Номер канала может быть длиной от 4 до 6 цифр."
  exit 1
fi

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #3 : 05 Январь 2011, 07:52:54 »
> это -gt
< это -lt
== это -eq
man test вообще то помогает

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #4 : 05 Январь 2011, 10:54:51 »
if [ "$kanal" -lt 1000 -o "$kanal" -qt 999999 ]
then
     echo "Неправильный номер канала. Номер канала может быть длиной от 4 до 6 цифр."
     exit 1
fi
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #5 : 05 Январь 2011, 11:44:07 »
 "$kanal" !=  $kanal для -gt и -lt
Я конечно далек от мысли...(с)

Оффлайн Ururu_2

  • Автор темы
  • Активист
  • *
  • Сообщений: 290
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #6 : 05 Январь 2011, 15:10:10 »
Всем спасибо!
Mam(O)n, отрицание там лишнее.
aliftin, qt по привычке написали?  ;)

man test - то рулит, кто ж спорит, только я прочитал в руководстве, что можно вообще test в проверке условия не использовать и думал, как обойтись без него. Потому как родные программистскому глазу "or", "and", "<", ">" читаются легче чем "-gt", "-lt" и т.д.
Цитировать
"$kanal" !=  $kanal для -gt и -lt
То,ч то они отличаются, я понял, ибо в разных примерах по-разному использовались. Но вот в чём именно состоит отличие, до меня так и не дошло.

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #7 : 05 Январь 2011, 15:44:17 »
Mam(O)n, отрицание там лишнее.
Это еще почему? В тело блока if нужно входить же при неправильном вводе? Или я че не понимаю?

Оффлайн Ururu_2

  • Автор темы
  • Активист
  • *
  • Сообщений: 290
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #8 : 05 Январь 2011, 16:36:29 »
В тело блока нужно входить при неправильном вводе, всё верно. Но с восклицательным знаком не работало, наоборот, при правильном адресе выдавало ошибку. Убрал - заработало.

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #9 : 05 Январь 2011, 16:44:46 »
У нас получается интерпретаторы разные чтоли:
mamon@mamon-netbook:/usr/home/mamon/tmp$ channel=Хрень; if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then echo Неправильно; else echo Правильно; fi
Неправильно
mamon@mamon-netbook:/usr/home/mamon/tmp$ channel=123; if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then echo Неправильно; else echo Правильно; fi
Неправильно
mamon@mamon-netbook:/usr/home/mamon/tmp$ channel=1234; if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then echo Неправильно; else echo Правильно; fi
Правильно
mamon@mamon-netbook:/usr/home/mamon/tmp$ channel=123456; if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then echo Неправильно; else echo Правильно; fi
Правильно
mamon@mamon-netbook:/usr/home/mamon/tmp$ channel=1234567; if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then echo Неправильно; else echo Правильно; fi
Неправильно
mamon@mamon-netbook:/usr/home/mamon/tmp$ /bin/bash --version
GNU bash, версия 4.1.5(1)-release (i486-pc-linux-gnu)

Оффлайн Ururu_2

  • Автор темы
  • Активист
  • *
  • Сообщений: 290
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #10 : 05 Январь 2011, 17:02:23 »
Я проверял на реальном канале - 90802, скрипт ругался. проверь у себя.

З.Ы. Я просто подзабыл регулярные выражения. {4,6} точно означает "Длиной от 4 до 6", а не "длиной или 4 или 6"?

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #11 : 05 Январь 2011, 17:32:45 »
Я проверял на реальном канале - 90802, скрипт ругался. проверь у себя.
Всё отлично:
mamon@mamon-laptop:~$ channel=90802; if [[ ! "$channel" =~ ^[0-9]{4,6}$ ]]; then echo Неправильно; else echo Правильно; fi
Правильно

З.Ы. Я просто подзабыл регулярные выражения. {4,6} точно означает "Длиной от 4 до 6", а не "длиной или 4 или 6"?
Да, именно длинной от и до.

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #12 : 05 Январь 2011, 18:28:45 »
Я не то написал в том посте. Вам нужно измерять количество символов, а не сам диапазон? Мне это видится так:
kanal=2011

len=`expr length $kanal`
echo "$len"


if [ "$len" -ge 4 -a "$len" -le 6 ]
then
echo "Правильный!"
else
echo "Не правильный!"
fi
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #13 : 05 Январь 2011, 18:34:51 »
Я проверял на реальном канале - 90802, скрипт ругался. проверь у себя.
Может были лишние пробелы в начале или конце? Тогда выражение можно так подправить: if [[ ! "$channel" =~ ^\ *[0-9]{4,6}\ *$ ]]; then

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Проверка сложного условия в bash-скрипте
« Ответ #14 : 05 Январь 2011, 18:39:50 »
Ururu_2, как вы получаете переменную "$kanal"?
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

 

Страница сгенерирована за 0.057 секунд. Запросов: 24.