Регулярные выражения в выражении case Bash
Я использую следующий script, который использует оператор case для поиска сервера.
#!/bin/bash
SERVER=$1;
echo $SERVER | egrep "ws-[0-9]+\.host\.com";
case $SERVER in
ws-[0-9]+\.host\.com) echo "Web Server"
;;
db-[0-9]+\.host\.com) echo "DB server"
;;
bk-[0-9]+\.host\.com) echo "Backup server"
;;
*)echo "Unknown server"
;;
esac
Но он не работает. Regex работает с egrep, но не с футляром. образец O/P
./test-back.sh ws-23.host.com
ws-23.host.com
Unknown server
Любая идея?
Ответы
Ответ 1
Bash case не использует регулярные выражения, но соответствие шаблону оболочки.
Поэтому вместо regex ws-[0-9]+\.host\.com
вы должны использовать pattern ws*.host.com
(или ws-+([0-9]).host.com
, но это выглядит немного продвинутым, и я никогда не пробовал это: -)
Ответ 2
Если вы хотите утверждать, что *
действительно соответствует цифрам в ws*.host.com
и хочет использовать case
вместо if
, elif
, elif
...
вы можете использовать что-то вроде этого:
case $SERVER in
ws-[0123456789][0123456789][0123456789].host.com) echo "Web Server" ;;
db-[0123456789][0123456789][0123456789].host.com) echo "DB server" ;;
bk-[0123456789][0123456789][0123456789].host.com) echo "Backup server" ;;
*) echo "Unknown server" ;;
esac
Но это не работает для более чем 999 серверов.
Если мне понадобилось сделать script для этого варианта использования, я, вероятно, напишу что-то вроде этого (потому что я люблю регулярные выражения и синтаксис case;)):
srv=`expr "$SERVER" : '^\(db\|bk\|ws\)-[0-9]\+\.host\.com$'`
echo -n "$SERVER : "
case $srv in
ws) echo "Web Server" ;;
db) echo "DB server" ;;
bk) echo "Backup server" ;;
*) echo "Unknown server !!!"
esac
Ответ 3
case
может использовать только глобусы. Если вы хотите выполнить сопоставление регулярных выражений, вам нужно будет использовать ряд операторов if-then-else-elif-fi
с [[
.
Ответ 4
Вы также можете использовать expr
для выполнения сопоставления; он обеспечивает синтаксис регулярного выражения, подобный grep, который должен быть достаточно прочным для этого приложения.
#!/bin/bash
server=$1
if expr "$server" : 'ws-[0-9]\+\.host\.com' >/dev/null; then echo "Web server"
elif expr "$server" : 'db-[0-9]\+\.host\.com' >/dev/null; then echo "DB server"
elif expr "$server" : 'bk-[0-9]\+\.host\.com' >/dev/null; then echo "Backup server"
else echo "Unknown server"
fi
Ответ 5
Вот пример того, как использовать конструкцию elif.
#!/bin/bash
SERVER=$1;
regex_ws="^ws-[0-9]+\.host\.com$"
regex_db="^db-[0-9]+\.host\.com$"
regex_bk="^bk-[0-9]+\.host\.com$"
if [[ "${SERVER}" =~ $regex_ws ]]; then
echo "Web Server"
elif [[ "${SERVER}" =~ $regex_db ]]; then
echo "DB server"
elif [[ "${SERVER}" =~ $regex_bk ]]; then
echo "Backup server"
else
echo "Unknown server"
fi
Я считаю наиболее надежным хранить регулярные выражения в своих переменных.