Проверьте, является ли строка допустимым целым числом - PullRequest
103 голосов
/ 05 февраля 2010

Я пытаюсь сделать что-то достаточно общее: анализ пользовательского ввода в сценарии оболочки.Если пользователь предоставил правильное целое число, скрипт выполняет одно действие, а если он недействителен, он выполняет другое.Проблема в том, что я не нашел простого (и достаточно элегантного) способа сделать это - я не хочу разбирать его на части по символам.

Я знаю, что это должно быть легко, но я нене знаю как.Я мог бы сделать это на дюжине языков, но не на BASH!

В своем исследовании я нашел следующее:

Регулярное выражение для проверки, состоит ли строка из действительного действительного числа в базе10

И там есть ответ, в котором говорится о регулярных выражениях, но, насколько я знаю, эта функция доступна в C (среди прочих).Тем не менее, он выглядел как отличный ответ, поэтому я попробовал его с помощью grep, но grep не знал, что с ним делать.Я попытался -P, что на моем поле означает рассматривать его как регулярное выражение PERL - нада.Тире E (-E) тоже не сработало.И ни один не сделал -F.

Просто чтобы прояснить ситуацию, я пытаюсь что-то вроде этого, ищу любой вывод - оттуда я взломаю сценарий, чтобы воспользоваться всем, что я получу.(IOW, я ожидал, что несоответствующий ввод ничего не выдаст, в то время как допустимая строка повторяется.)

snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
   echo "Not an integer - nothing back from the grep"
else
   echo "Integer."
fi

Кто-нибудь, пожалуйста, проиллюстрируйте, как это легче всего сделать?

Честно говоря,на мой взгляд, это недопустимый ТЕСТ.Он должен иметь такой флаг

if [ -I "string" ] ;
then
   echo "String is a valid integer."
else
   echo "String is not a valid integer."
fi

Ответы [ 11 ]

0 голосов
/ 09 февраля 2013

или с седом:

   test -z $(echo "2000" | sed s/[0-9]//g) && echo "integer" || echo "no integer"
   # integer

   test -z $(echo "ab12" | sed s/[0-9]//g) && echo "integer" || echo "no integer"
   # no integer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...