Этого можно добиться с помощью grep
, чтобы проверить, соответствует ли рассматриваемая переменная расширенному регулярному выражению.
Целочисленный тест 1120
:
yournumber=1120
if [ $(echo "$yournumber" | grep -qE '^[0-9]+$'; echo $?) -ne "0" ]; then
echo "Error: not a number."
else
echo "Valid number."
fi
Выход: Valid number.
Тест не целое число 1120a
:
yournumber=1120a
if [ $(echo "$yournumber" | grep -qE '^[0-9]+$'; echo $?) -ne "0" ]; then
echo "Error: not a number."
else
echo "Valid number."
fi
Выход: Error: not a number.
Объяснение
- Переключатель
grep
, -E
позволяет нам использовать расширенное регулярное выражение '^[0-9]+$'
. Это регулярное выражение означает, что переменная должна содержать []
только цифры 0-9
от нуля до девяти, начиная с ^
, начиная с $
конца переменной, и должна содержать не менее +
одного символа.
-
grep
, тихий переключатель -q
отключает любой выход независимо от того, находит ли он что-либо.
$?
- состояние выхода предыдущей выполненной команды. Статус выхода 0
означает успех, а что-либо большее означает ошибку. Команда grep
имеет статус выхода 0
, если находит совпадение, и 1
, если нет;
$()
- это подоболочка, которая позволяет нам выполнить другую команду и затем использовать вывод.
Таким образом, складывая все это вместе в $()
подоболочку, мы echo
переменной $yournumber
и |
передаем ее в grep
, который с переключателем -q
тихо соответствует расширенной регулярной форме -E
выражение '^[0-9]+$'
выражение. Затем мы echo
$?
выходим из состояния, которое будет 0
, если grep
успешно найдет совпадение, и 1
, если оно не найдено.
Теперь, за пределами подоболочки $()
и обратно в условном выражении if
, мы берем вывод, либо 0
или 1
из подоболочки $()
, и проверяем, не равен ли он -ne
до "0"
. Если он не соответствует, статус выхода будет 1
, что не соответствует "0"
. Тогда мы будем echo "Error: not a number."
. В случае совпадения выходное состояние будет равно 0
, что равно "0"
, и в этом случае мы echo "Valid number."
.
Для чисел с плавающей или двойной
Мы можем просто изменить регулярное выражение с '^[0-9]+$'
на '^[0-9]*+\.?[0-8]+$'
для чисел с плавающей запятой или двойных чисел.
Испытательный поплавок 1120.01
:
yournumber=1120.01
if [ $(echo "$yournumber" | grep -qE '^[0-9]*+\.?[0-8]+$'; echo $?) -ne "0" ]; then
echo "Error: not a number."
else
echo "Valid number."
fi
Выход: Valid number.
Испытательный поплавок 11.20.01
:
yournumber=11.20.01
if [ $(echo "$yournumber" | grep -qE '^[0-9]*+\.?[0-8]+$'; echo $?) -ne "0" ]; then
echo "Error: not a number."
else
echo "Valid number."
fi
Вывод: Error: not a number.
для негативов
Чтобы разрешить отрицательные целые числа, просто измените регулярное выражение с '^[0-9]+$'
на '^\-?[0-9]+$'
.
Чтобы разрешить отрицательные числа с плавающей запятой или двойные числа, просто измените регулярное выражение с '^[0-9]*+\.?[0-8]+$'
на '^\-?[0-9]*+\.?[0-8]+$'
.