Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - [14]

Шрифт
Интервал

># Проверка ввода

>if validint "$1" "$2" "$3"; then

>····echo "Input is a valid integer within your constraints."

>fi

Результаты

После добавления кода из листинга 1.10, сценарий можно использовать, как показано в листинге 1.11:

Листинг 1.11. Тестирование сценария validint

>$ validint 1234.3

>Invalid number format! Only digits, no commas, spaces, etc.

>$ validint 103 1 100

>Your value is too big: largest acceptable value is 100.

>$ validint -17 0 25

>Your value is too small: smallest acceptable value is 0.

>$ validint -17 -20 25

>Input is a valid integer within your constraints.

Усовершенствование сценария

Обратите внимание на строку , которая проверяет, не является ли первый символ знаком «минус»:

>if ["${number%${number#?}}" = "-"]; then

Если первый символ действительно является знаком «минус», переменной testvalue присваивается числовая часть значения. Затем из этого неотрицательного значения удаляются все цифры и выполняется следующая проверка.

В данном случае велик соблазн использовать логический оператор И (-a), чтобы объединить выражения и избавиться от вложенных инструкций if. Например, на первый взгляд кажется, что следующий код должен работать:

>if [! -z $min −a "$number" −lt "$min"]; then

>··echo "Your value is too small: smallest acceptable value is $min." >&2

>··exit 1

>fi

Но он не работает, потому что, даже если первое выражение, слева от оператора И, вернет ложное значение, нет никаких гарантий, что вторая проверка не будет выполнена (хотя в большинстве других языков программирования получилось бы именно так). То есть вы рискуете столкнуться со множеством ошибок из-за сравнения недействительных или неожиданных значений. Так быть не должно, но таковы реалии программирования на языке командной оболочки.

№ 6. Проверка ввода: вещественные числа

Проверка вещественных значений (с плавающей точкой) при ограниченных возможностях командной оболочки на первый взгляд кажется сложнейшей задачей, но представьте, что вещественное число состоит из двух целых чисел, разделенных десятичной точкой. Добавьте сюда возможность сослаться на другой сценарий (validint), и вы удивитесь, насколько короткой бывает проверка вещественных значений. Сценарий в листинге 1.12 предполагает, что находится в одном каталоге со сценарием validint.

Код

Листинг 1.12. Сценарий validfloat

>#!/bin/bash

># validfloat — Проверяет допустимость вещественного значения.

>#·· Имейте в виду, что сценарий не распознает научную форму записи (1.304e5).

># Чтобы проверить вещественное значение, его нужно разбить на две части:

>#·· целую и дробную. Первая часть проверяется как обычное целое число,

>#·· а дробная — как положительное целое число. То есть число -30.5 оценивается

>#·· как допустимое, а -30.-8 нет.

># Подключение других сценариев к текущему осуществляется с помощью оператора"."

># Довольно просто.

>. validint

>validfloat()

>{

>··fvalue="$1"

>··# Проверить наличие десятичной точки.

>··if [! -z $(echo $fvalue | sed 's/[^.]//g')]; then

>····# Извлечь целую часть числа, слева от десятичной точки.

>····decimalPart="$(echo $fvalue | cut −d. -f1)"

>····# Извлечь дробную часть числа, справа от десятичной точки.

>····fractionalPart="${fvalue#*\.}"

>····# Проверить целую часть числа, слева от десятичной точки

>····if [! -z $decimalPart]; then

>······# "!" инвертирует логику проверки, то есть ниже проверяется

>······#·· "если НЕ допустимое целое число"

>······if! validint "$decimalPart" "" ""; then

>········return 1

>······fi

>····fi

>····# Теперь проверим дробную часть.

>····# Прежде всего, она не может содержать знак "минус" после десятичной точки,

>····#·· например: 33.-11, поэтому проверим знак '-’ в дробной части.

>····if ["${fractionalPart%${fractionalPart#?}}" = "-"]; then

>······echo "Invalid floating-point number: '-' not allowed \

>········after decimal point." >&2

>······return 1

>····fi

>····if ["$fractionalPart"!= ""]; then

>······# Если дробная часть НЕ является допустимым целым числом…

>······if! validint "$fractionalPart" "0" ""; then

>········return 1

>······fi

>····fi

>··else

>····# Если все значение состоит из единственного знака "-",

>····#·· это недопустимое значение.

>····if ["$fvalue" = "-"]; then

>······echo "Invalid floating-point format." >&2

>······return 1

>····fi

>····# В заключение проверить, что оставшиеся цифры представляют

>····# допустимое целое число.

>····if! validint "$fvalue" "" ""; then

>······return 1

>····fi

>··fi

>··return 0

>}

Как это работает

Сценарий сначала проверяет наличие десятичной точки во входном значении

. Если точки в числе нет, это не вещественное число. Далее для анализа извлекаются целая
и дробная
части числа. Затем, в строке
, сценарий проверяет, является ли целая часть (слева от десятичной точки) допустимым целым числом. Следующая последовательность проверок сложнее, потому что требуется проверить
отсутствие дополнительного знака «минус» (чтобы исключить такие странные числа, как 17. –30) и убедиться, что дробная часть (справа от десятичной точки) является допустимым целым числом.

Последняя проверка в строке

выясняет, не является ли проверяемое значение единственным знаком «минус» (такое число выглядело бы слишком странно, чтобы пропустить его).


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Тонкости реестра Windows Vista. Трюки и эффекты

Реестр Windows является важной частью операционной системы, во многом определяющей ее работу. Изучив приведенный в этой книге материал, вы научитесь редактировать реестр Windows Vista по своему усмотрению, а также освоите многочисленные приемы оптимизации содержащихся в нем настроек операционной системы.


Отладка систем реального времени

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Iptables Tutorial 1.1.19

Iptables Tutorial 1.1.19Автор: (C) Oskar AndreassonCopyright (C) 2001-2002 by Oskar AndreassonПеревод: (C) Андрей КиселевПоследнюю версию документа можно получить по адресу: http://iptables-tutorial.frozentux.netfb2-документ отформатирован с использованием большого количества тегов и . Чтобы в «читалке» (в частности, Haali Reader) текст выглядел «красиво», настройте свойства соотвествующих стилей (emphasis и strong), изменив, например, их цвета или начертания. (прим. автора fb2-документа)


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)