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 |
|
8/30/16 06:23 am
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 На pastebin2. положительные и отрицательные целые числа #!/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/
8/30/16, 08:57 am
а чего, родные башевые сопоставлялки уже немодные?
#!/bin/bash
s="666"
shopt -s extglob # magic!
if [[ $s == +([0‒9]) ]]; then
echo "BINGO!"
fi
8/30/16, 08:59 am
grep, впрочем (или sed, или tr, или…) имеет то положительное свойство, что не башизм.
8/31/16, 01:55 am
именно что, студент, для которого в частности я это писал, сказал, что препод отверг похожее решение, ибо "башизм" и попросил сделать лучше, я тоже подумал, ну раз профессор говорит, то надо как-то по-другому сделать, сделал по-другому, хотя толком сам так и не понял, чем плохо использовать встроенные фенечки bash. Если не в падлу, объясни, чем плох "башизм" и кто он такой, я не профессионал с сертификатами и толком не понял. Насколько понял, башевская конструкция вызовет ошибку при выполнении в средах с ограниченным окружением, например, на маршрутизаторе, поскольку там нет оболочки bash, а есть только sh. Я правильно понимаю?
8/31/16, 02:04 am
впрочем, если там есть греп, то баш туда не положили только потому, что вендор — дегенерат.
9/3/16, 05:46 pm
Ну не знаю, на моем роутере домашнем ash (которая, насколько понимаю != bash) и bisybox, который и grep'ом прикидывается успешно в initrd, кстати, тоже так же, оболочка sh, а grep есть, как часть bisybox'а. Насколько я понимаю, сейчас это чуть ли не общее место для систем со "спартанским" окружением - bisybox, который собой чуть ли не половину основных утилит подменяет, а сам крохотный и sh.
9/3/16, 06:06 pm
да, каюсь, забыл про ящик. ок, дегенератом оказался я.
9/4/16, 01:50 am
Не ты, а я, ведь мне пришлось разобраться, как система на моем роутере устроена, и что делает систему такой маленькой при сохранении функционала, и дополнить свои знания по initrd, перепроверить. Так что дебил я. Узнал больше, чем должен был знать.
9/4/16, 08:34 am
дегенератами вендоров обозвал я. тащемта, не по делу. ну и вот.
|