Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
BASH: Как проверить, число или строка в переменной.

Переменные в BASH, как известно, типа не имеют (и как же это иной раз бесит). А проверить, что в переменной - число или строка иногда надо. На помощь придет grep и регулярные выражения.

Команда grep -E -q regexp проверит, соответствует ли переданная grep строка, регулярному выражению regexp
Ключ -E укажет команде grep, что образец есть полное регулярное выражение (см. подробности здесь )
Ключ -q укажет, что в стандартный поток ввода-вывода отправятся соответствующие образцу строки, и если хоть одна из входных строк соответствует образцу, то код завершения команды будет 0, иначе 1.
Для простого примера больше одной строки и не надо.

Осталось составить регулярные выражения для нашего случая:
Целое положительное число: ^?[0-9]+$
Целое положительное, либо отрицательное число: ^-?[0-9]+$

Для примера проверим первый параметр скрипта, задаваемый из командной строки
1. положительные целые числа

#!/bin/bash

if (echo "$1" | grep -E -q "^?[0-9]+$"); then
    echo "Number"
else
    echo "Not Number"
fi


На pastebin

2. положительные и отрицательные целые числа
#!/bin/bash

if (echo "$1" | grep -E -q "^-?[0-9]+$"); then
    echo "Number"
else
    echo "Not Number"
fi


На pastebin

Это репост заметки из моего блога на сайте http://tolik-punkoff.com
Оригинал заметки находится здесь: http://tolik-punkoff.com/2016/08/30/bash-kak-proverit-chislo-ili-stroka-v-peremennoj/

Tags: ,
Comments

а чего, родные башевые сопоставлялки уже немодные?

#!/bin/bash

s="666"

shopt -s extglob # magic!
if [[ $s == +([0‒9]) ]]; then
  echo "BINGO!"
fi

grep, впрочем (или sed, или tr, или…) имеет то положительное свойство, что не башизм.

именно что, студент, для которого в частности я это писал, сказал, что препод отверг похожее решение, ибо "башизм" и попросил сделать лучше, я тоже подумал, ну раз профессор говорит, то надо как-то по-другому сделать, сделал по-другому, хотя толком сам так и не понял, чем плохо использовать встроенные фенечки bash. Если не в падлу, объясни, чем плох "башизм" и кто он такой, я не профессионал с сертификатами и толком не понял. Насколько понял, башевская конструкция вызовет ошибку при выполнении в средах с ограниченным окружением, например, на маршрутизаторе, поскольку там нет оболочки bash, а есть только sh. Я правильно понимаю?

впрочем, если там есть греп, то баш туда не положили только потому, что вендор — дегенерат.

Ну не знаю, на моем роутере домашнем ash (которая, насколько понимаю != bash) и bisybox, который и grep'ом прикидывается успешно
в initrd, кстати, тоже так же, оболочка sh, а grep есть, как часть bisybox'а.
Насколько я понимаю, сейчас это чуть ли не общее место для систем со "спартанским" окружением - bisybox, который собой чуть ли не половину основных утилит подменяет, а сам крохотный и sh.

да, каюсь, забыл про ящик. ок, дегенератом оказался я.

Не ты, а я, ведь мне пришлось разобраться, как система на моем роутере устроена, и что делает систему такой маленькой при сохранении функционала, и дополнить свои знания по initrd, перепроверить. Так что дебил я. Узнал больше, чем должен был знать.

дегенератами вендоров обозвал я. тащемта, не по делу. ну и вот.