Переменные в 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-k
Page Summary
![]()
October 2025
|
BASH: Как проверить, число или строка в переменной.
а чего, родные башевые сопоставлялки уже немодные? #!/bin/bash s="666" shopt -s extglob # magic! if [[ $s == +([0‒9]) ]]; then echo "BINGO!" fi именно что, студент, для которого в частности я это писал, сказал, что препод отверг похожее решение, ибо "башизм" и попросил сделать лучше, я тоже подумал, ну раз профессор говорит, то надо как-то по-другому сделать, сделал по-другому, хотя толком сам так и не понял, чем плохо использовать встроенные фенечки bash. Если не в падлу, объясни, чем плох "башизм" и кто он такой, я не профессионал с сертификатами и толком не понял. Насколько понял, башевская конструкция вызовет ошибку при выполнении в средах с ограниченным окружением, например, на маршрутизаторе, поскольку там нет оболочки bash, а есть только sh. Я правильно понимаю? Ну не знаю, на моем роутере домашнем ash (которая, насколько понимаю != bash) и bisybox, который и grep'ом прикидывается успешно Не ты, а я, ведь мне пришлось разобраться, как система на моем роутере устроена, и что делает систему такой маленькой при сохранении функционала, и дополнить свои знания по initrd, перепроверить. Так что дебил я. Узнал больше, чем должен был знать. |