Intereting Posts
Веб-браузер командной строки с проверкой подлинности Kerberos? Удалите строку, если регулярное выражение существует только в 1-м столбце каждой строки в файле csv Какие установленные пакеты программного обеспечения используют большинство дискового пространства на Debian? Встроенная программа Linux для комментариев Параметры TCP SACK и масштабирование окна не изменяются на Ubuntu 16.04 TCP, UDP и т. Д., HTTP (S) не Запуск rsync в качестве демона для локальной передачи Нужно ли устанавливать загрузчик? Вырезать поле в строке с bash Определяет ли номер inode то, какие файлы были созданы раньше других? Что такое DRPM и как он отличается от RPM? hpux 11.31: в чем разница между распределенным объемом и полосой lvm? Извлечь текст, включая parens Почему я не могу восстановить (почти) все свободное место с помощью resize2fs? Как диагностировать проблему рендеринга шрифтов?

Скажите, как эта команда проверяет, имеет ли rnum целое число или нет

Я видел такую ​​конструкцию в сценарии оболочки, которая используется для проверки того, является ли $rnum числом:

 if ! [ "$rnum" -eq "$rnum" ] 2> /dev/null; then echo "rnum is not a number" exit 1 fi 

Кажется, что это работает, но я не понимаю, почему – не нужно ли тестировать что-то для равенства против себя, всегда быть правдой? Как / почему это работает?

Ульрих Шварц действительно ответил на вопрос уже в своем комментарии. Просто оставьте 2>/dev/null и посмотрите, что произойдет, когда $rnum не является целым числом. Рассмотрим следующий пример, написанный на интерактивной сессии bash :

 $ rnum='foo' $ [ "$rnum" -eq "$rnum" ] -bash: [: foo: integer expression expected $ echo $? 2 

Если вы ищете альтернативный метод проверки того, является ли значение целочисленным, Prashant Band уже дал один. Однако я предпочитаю более портативное решение (которое не полагается на оператор =~ ):

 expr "X$rnum" : 'X[-+]\{0,1\}[0-9]\{1,\}$' >/dev/null || { echo 'rnum is not a number' >&2 exit 1 } 

Обратите внимание, что странные значения, такие как -0 , +0 и 000 , рассматриваются как целые числа. Тем не менее, это то же самое поведение, которое вы получите, используя оригинальную конструкцию, представленную в вашем вопросе.

Этот скрипт проверяет, является ли он номером или нет:

 num=123 if [[ "$num" =~ ^[0-9]+$ ]] then echo "It is Number" fi