Подтвердить что ты не робот

Регулярные выражения в выражении 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

Любая идея?

4b9b3361

Ответ 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

Я считаю наиболее надежным хранить регулярные выражения в своих переменных.