#!/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. Где я ошибся?
Этот код удара возвращает целое число для целых чисел как 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
Я не могу воспроизвести Вашу ошибку, но так как она жалуется на недопустимый диапазон, это - наиболее вероятный 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 возможности:
001002
целое число, зависит от того, о какой математике Вы думаете)..2
может считаться допустимым в некоторых случаях; если Вы не хотите это, изменяетесь ^\d*\.\d+$
кому: ^\d+\.\d+$
).1.
который не является допустимым плаванием и не допустимым целым числом.Я разделил 3 и 4, но можно присоединиться к ним и сделать, чтобы они распечатали то же, если Вам нравится.
Кроме того, благодарность Karel для размышления +N
и -N
числа.