··# Проверяет первое значение и сравнивает с минимальным значением $2 и/или
··#·· с максимальным значением $3, если они заданы. Если проверяемое значение
··#·· вне заданного диапазона или не является допустимым целым числом,
··#·· возвращается признак ошибки.
··number="$1"; min="$2"; max="$3"
····echo "You didn't enter anything. Please enter a number." >&2
····return 1
··fi
··# Первый символ — знак "минус"?
····testvalue="${number#?}" # Оставить для проверки все, кроме первого символа
··else
····testvalue="$number"
··fi
··# Удалить все цифры из числа для проверки.
··# Проверить наличие нецифровых символов.
··if [! -z $nodigits]; then
····echo "Invalid number format! Only digits, no commas, spaces, etc." >&2
····return 1
··fi
····# Входное значение меньше минимального?
····if ["$number" −lt "$min"]; then
······echo "Your value is too small: 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.10.
Листинг 1.10. Дополнительная поддержка, превращающая сценарий в самостоятельную команду
# Проверка ввода
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.
Усовершенствование сценария
Обратите внимание на строку