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

We use cookies. Read the Privacy and Cookie Policy

Использование новой для нас возможности приема ввода с клавиатуры влечет за собой дополнительную проблему: необходимость проверки введенных данных. Очень часто хорошо написанная программа отличается от плохо написанной готовностью к неожиданностям. Зачастую неожиданности возникают в форме ввода ошибочных данных. Мы уже сделали кое-что, чтобы противостоять неожиданностям в программах проверки целочисленных значений из предыдущей главы, где предусмотрено отсеивание пустых значений и значений с нецифровыми символами. Такого рода программные проверки должны выполняться для любых вводимых данных, чтобы обезопасить программу от недопустимых значений. Это особенно актуально для программ, используемых множеством пользователей. Отказ от защитных мер ради экономии простителен, только если программа пишется для однократного использования автором с целью решения некоей специальной задачи. Но даже в этом случае, если программа выполняет потенциально опасные операции, такие как удаление файлов, на всякий случай включите в нее проверку данных.

Далее приводится пример программы, проверяющий входные данные разного вида:

#!/bin/bash

# read-validate: проверка ввода

invalid_input () {

echo "Invalid input '$REPLY'" >&2

exit 1

}

read -p "Enter a single item > "

# пустой ввод (недопустимо)

[[ -z $REPLY ]] && invalid_input

# ввод множества элементов (недопустимо)

(( $(echo $REPLY | wc -w) > 1 )) && invalid_input

# введено допустимое имя файла?

if [[ $REPLY =~ ^[-[:alnum:]._]+$ ]]; then

echo "'$REPLY' is a valid filename."

if [[ -e $REPLY ]]; then

echo "And file '$REPLY' exists."

else

echo "However, file '$REPLY' does not exist."

fi

# введено вещественное число?

if [[ $REPLY =~ ^-?[[:digit:]]*.[[:digit:]]+$ ]]; then

echo "'$REPLY' is a floating point number."

else

echo "'$REPLY' is not a floating point number."

fi

# введено целое число?

if [[ $REPLY =~ ^-?[[:digit:]]+$ ]]; then

echo "'$REPLY' is an integer."

else

echo "'$REPLY' is not an integer."

fi

else

echo "The string '$REPLY' is not a valid filename."

fi

Этот сценарий предлагает пользователю ввести элемент данных и затем последовательно анализирует его содержимое. Как видите, в сценарии использовано множество идей, с которыми мы уже познакомились, включая функции [[ ]], (( )), операторы управления && и if, а также разумную дозу регулярных выражений healthy.