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