Я пытаюсь сделать что-то достаточно распространенное: анализировать вводимые пользователем данные в сценарии оболочки. Если пользователь предоставил действительное целое число, сценарий выполняет одно действие, а если он недопустим, - другое. Проблема в том, что я не нашел простого (и достаточно элегантного) способа сделать это - я не хочу, чтобы ему приходилось разбирать char на char.
Я знаю, что это должно быть легко, но не знаю как. Я мог бы сделать это на десятке языков, но не на БАШЕ!
В своем исследовании я обнаружил следующее:
И там есть ответ, в котором говорится о регулярном выражении, но, насколько я знаю, эта функция доступна в C (среди прочего). Тем не менее, это выглядело как отличный ответ, поэтому я попробовал его с помощью grep, но grep не знал, что с ним делать. Я попробовал -P, что на моем поле означает рассматривать его как регулярное выражение PERL - нада. Dash 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
Не могли бы вы проиллюстрировать, как это проще всего сделать?
Честно говоря, это, на мой взгляд, недостаток TEST. У него должен быть такой флаг
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
старая совместимаяtest
;[[
это новая вещь Bash, с большим количеством операций и другими правилами цитирования. Если вы уже решили придерживаться Bash, сделайте[[
это (он намного лучше); если вам нужна переносимость на другие оболочки,[[
полностью избегайте .