сценарий оболочки, чтобы проверить, является ли ввод строкой / целым числом / с плавающей точкой

#!/bin/bash

read -p "Enter value:" val

echo "$val"|grep "^[0-9]*$"
val="$?"

if [[ $val == 0 ]]
then
echo "Integer"
exit
fi

echo $val|grep "^[a-zA-Z]*$"

val="$?"

if [[ $val == 0 ]]
then
echo "String"
exit
fi


echo $val|grep "^[0-9]*.[0-9]*$"

val="$?"

if [[ $val == 0 ]]
then
echo "Float"
exit
fi

Если я ввожу строку типа «ape», она говорит «grep invalid range», а затем печатает float. Где я ошибся?

3
задан 14 September 2019 в 16:33

2 ответа

Этот код удара возвращает целое число для целых чисел как 123, плавание для чисел с плавающей точкой как 123,4 и строка для любых других входных значений как "123", One23 123. или 123.4.5.

#!/bin/bash
read -p "Type a number or a string: " input
if [[ $input =~ ^[+-]?[0-9]+$ ]]; then
echo "Input is an integer."

elif [[ $input =~ ^[+-]?[0-9]+\.$ ]]; then
echo "Input is a string."

elif [[ $input =~ ^[+-]?[0-9]+\.?[0-9]*$ ]]; then
echo "Input is a float."

else
echo "Input is a string."
fi
2
ответ дан 1 December 2019 в 15:32

Я не могу воспроизвести Вашу ошибку, но так как она жалуется на недопустимый диапазон, это - наиболее вероятный a locale проблема. Попытайтесь запустить свой скрипт снова, но установить локаль:

LC_ALL=C yourscript.sh

Конечно, это не решит другую проблему, которая является:

echo $val|grep "^[a-zA-Z]*$"

val="$?"

После тех строк, $val больше не значение, которое Вы дали, это - теперь статус выхода grep, таким образом, все после этого тестирует неправильную вещь.


В любом случае это действительно напрасно сложно. Все, в чем Вы действительно нуждаетесь:

#!/bin/bash

val="$@"

[[ -z $val ]] && echo "No input!" && exit

if [[ "$val" =~ ^[+-]?[0-9]+$ ]]; then
  echo "Number!" 
elif [[ $val =~ ^[+-]?[0-9]*\.[0-9]+$ ]]; then
  echo "Float!"
elif [[ $val =~ [0-9] ]]; then
  echo "Mixed, some numbers"
else
  echo "No numbers!"
fi  

Обратите внимание, что я использую val="$@" вместо read. Это означает, что можно теперь запустить скрипт как yourscript.sh input вместо того, чтобы иметь необходимость вывести вход каждый раз. Тем путем Вы видите то, что Вы сделали в истории, Вы избегаете опечаток, можно запустить скрипт автоматически и т.д. Это обычно - плохая идея использовать read и вынудите своих пользователей ввести вход.

Также обратите внимание, что я изменил некоторые Ваши условия. Я теперь рассматриваю 4 возможности:

  1. Вход имеет только числа: распечатайте "Число" (ли 001002 целое число, зависит от того, о какой математике Вы думаете).
  2. Вход состоит из 0 или больше чисел, затем точка и затем только числа (0 или больше, потому что .2 может считаться допустимым в некоторых случаях; если Вы не хотите это, изменяетесь ^\d*\.\d+$ кому: ^\d+\.\d+$).
  3. Вход имеет числа, но не только числа: распечатайте "Смешанный, некоторые числа". Обратите внимание, что это также поймает 1. который не является допустимым плаванием и не допустимым целым числом.
  4. Вход не имеет никаких чисел: не распечатайте "Числа".

Я разделил 3 и 4, но можно присоединиться к ним и сделать, чтобы они распечатали то же, если Вам нравится.

Кроме того, благодарность Karel для размышления +N и -N числа.

3
ответ дан 1 December 2019 в 15:32

Другие вопросы по тегам:

Похожие вопросы: