2009-05-11 3 views
7

Я написал сценарий bash, который принимает числа для вычисления через пользовательский ввод. Проблема в том, что если пользователь набирает букву или пробел по ошибке, весь скрипт терпит неудачу, и пользователь должен начать заново.Bash: проверьте правильность ввода пользователя

Должен быть простой способ проверить, что ввод только числовой, который будет запрашивать ввод снова, если что-то еще случайно вводится?

ответ

17

Используйте время цикла

number="" 
while [[ ! $number =~ ^[0-9]+$ ]]; do 
    echo Please enter your age 
    read number 
done 
echo You are $number years old 
+0

Да, это работает, спасибо, но я повторно использую одну и ту же переменную, поэтому в следующий раз, когда она приближается, она имеет значение от последней записи. любые идеи? – 2009-05-11 14:43:47

+0

Я не совсем понимаю, что вы имеете в виду. Именно поэтому мы ее установили до пустой строки, прежде чем мы войдем в цикл :) –

+1

Решение выше по-прежнему принимает входные данные, такие как «22aa», «aa 22» или «a23bb». Регулярное выражение должно включать начало d конец строки: в то время как [[! ($ number = ~^[0-9] + $)]]; do –

8

И, чтобы избежать тяжелых регулярных выражений двигатель, используйте простой Glob:

if [[ ! $input || $input = *[^0-9]* ]]; then 
    echo "Error: '$input' is not a number." >&2 
fi 
+0

О, хорошая идея. Я продолжаю забывать о [[globing] объектах. я нашел, что он принимает "". "$ input =" "|| $ input = * [^ 0-9] *" должен исправить это. –

+0

Ошибка в том, что он принимает пустой ввод. –

4

Позволяет пространство до и после номера, _33 или 33___, но не 3__3. и никаких писем. 0 или

- Получить ввод от пользователя до Correct

# -- get input until Correct 
    unset get_num 
    while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do 
     echo "Please enter in a number:" 
     read get_num 
    done 
    echo This is a number : ${get_num} 

- Получить вход до Correct (в пределах диапазона)

# -- get input until Correct (within range) 
    unset get_num 
    while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do 
     echo "Please enter in a number within range of (1-30):" 
     read get_num 
     ! [[ ${get_num} -ge 1 && ${get_num} -le 30 ]] && unset get_num 
    done 
    echo This is a number withn a range : ${get_num} 

- не получить ввод до Correct (в пределах диапазона) (full regex way)

«Поскольку регулярные выражения имеют дело с текстом, а не с цифрами, то сопоставление числа в заданном диапазоне требует немного дополнительной помощи. Вы не можете просто написать [0-255 ], чтобы соответствовать числу от 0 до 255. Хотя действительное регулярное выражение совпадает с чем-то совершенно другим. [0-255] - это класс символов с тремя элементами: диапазон символов 0-2, символ 5 и символ 5 (снова). Этот класс символов соответствует одна цифра 0, 1, 2 или 5, так же, как [0125] «~ http://www.regular-expressions.info/numericranges.html

# -- get input until Correct (within range) (another way) 
    unset get_num 
    while [[ ! ${get_num} =~ ^([1-9]|1[0-9]|2[0-9]|30)$ ]]; do 
     echo "Please enter in a number within range of (1-30):" 
     read get_num 
    done 
    echo This is a number withn a range : ${get_num} 

-. Получить вход и проверить его только (не в то время как петля)

# -- get input, and check it only (no while loop) 
    unset get_num 
    echo "Please enter in a number:" 
    read get_num 
    if [[ ! ${get_num} =~ ^[0-9]+$ ]] ;then 
     echo "${get_num} isn't a number" 
    else 
     echo "${get_num} is a number" 
    fi 
Смежные вопросы