Выбрать главу

separator="$(echo $1 | sed 's/[[: digit: ]]//g')"

if [! -z "$separator" −a "$separator"!= "$DD"]; then

··echo "$0: Unknown decimal separator $separator encountered." >&2

··exit 1

fi

№ 5. Проверка ввода: целые числа

Как было показано в сценарии № 2, проверка целых чисел осуществляется очень просто, пока дело не доходит до отрицательных значений. Проблема в том, что всякое отрицательное число может содержать только один знак «минус», который обязан быть первым. Процедура проверки в листинге 1.9 оценивает правильность форматирования отрицательных чисел и, что особенно ценно, может проверить вхождение значений в установленный пользователем диапазон.

Код

Листинг 1.9. Сценарий validint

#!/bin/bash

# validint — Проверяет целые числа, поддерживает отрицательные значения

validint()

{

··# Проверяет первое значение и сравнивает с минимальным значением $2 и/или

··#·· с максимальным значением $3, если они заданы. Если проверяемое значение

··#·· вне заданного диапазона или не является допустимым целым числом,

··#·· возвращается признак ошибки.

··number="$1"; min="$2"; max="$3"

··if [-z $number]; then

····echo "You didn't enter anything. Please enter a number." >&2

····return 1

··fi

··# Первый символ — знак "минус"?

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

····testvalue="${number#?}" # Оставить для проверки все, кроме первого символа

··else

····testvalue="$number"

··fi

··# Удалить все цифры из числа для проверки.

··nodigits="$(echo $testvalue | sed 's/[[: digit: ]]//g')"

··# Проверить наличие нецифровых символов.

··if [! -z $nodigits]; then

····echo "Invalid number format! Only digits, no commas, spaces, etc." >&2

····return 1

··fi

··if [! -z $min]; then

····# Входное значение меньше минимального?

····if ["$number" −lt "$min"]; then

······echo "Your value is too smalclass="underline" smallest acceptable value is $min." >&2

······return 1

····fi

··fi

··if [! -z $max]; then

····# Входное значение больше максимального?

····if ["$number" −gt "$max"]; then

······echo "Your value is too big: largest acceptable value is $max." >&2

······return 1

····fi

··fi

··return 0

}

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

Проверка целочисленных значений реализуется очень просто благодаря тому что такие значения состоят исключительно из последовательности цифр (от 0 до 9), перед которой может находиться единственный знак «минус». Если в вызов функции validint() передать минимальное и (или) максимальное значение, она также проверит вхождение заданного значения в указанный диапазон.

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

Если введенное значение допустимо, оно сравнивается с минимальным и максимальным значениями . Наконец, в случае ошибки функция возвращает 1 и 0 — в случае успеха.

Запуск сценария

Весь сценарий целиком является функцией. Его можно скопировать в другой сценарий или подключить как библиотечный файл. Чтобы преобразовать его в команду, просто добавьте в конец файла код из листинга 1.10.

Листинг 1.10. Дополнительная поддержка, превращающая сценарий в самостоятельную команду

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

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