Следующее решение также может использоваться в базовых оболочках, таких как Bourne, без необходимости использования регулярных выражений. В основном любые операции вычисления числовых значений, использующие не числа, приведут к ошибке, которая будет неявно рассматриваться как ложная в оболочке:
"$var" -eq "$var"
как в:
#!/bin/bash
var=a
if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
echo number
else
echo not a number
fi
Вы также можете проверить на $? код возврата операции, который является более явным:
[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null
if [ $? -ne 0 ]; then
echo $var is not number
fi
Перенаправление стандартной ошибки предназначено для того, чтобы скрыть сообщение «ожидается целочисленное выражение», которое распечатывает bash, если у нас нет номера.
ПРЕДОСТЕРЕЖЕНИЯ (благодаря комментариям ниже):
- Числа с десятичными точками не определены как действительные "цифры"
- Использование
[[ ]]
вместо [ ]
всегда будет иметь значение true
- Большинство небашевых оболочек всегда будут оценивать это выражение как
true
- Поведение в Bash недокументировано и поэтому может меняться без предупреждения
- Если значение включает пробелы после числа (например, «1 a»), возникает ошибка, например
bash: [[: 1 a: syntax error in expression (error token is "a")
- Если значение совпадает с var-name (например, i = "i"), выдает ошибку, например
bash: [[: i: expression recursion level exceeded (error token is "i")