Expresiones regulares en una statement de caso Bash

Estoy usando la siguiente secuencia de comandos, que usa la statement de casos para encontrar el servidor.

#!/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 

Pero no está funcionando. Regex está trabajando con egrep pero no con el caso. muestra O / P

 ./test-back.sh ws-23.host.com ws-23.host.com Unknown server 

Alguna idea ?

El caso Bash no usa expresiones regulares, sino solo coincidencias de patrón de shell .

Por lo tanto, en lugar de regex ws-[0-9]+\.host\.com debe usar el patrón ws*.host.com (o ws-+([0-9]).host.com , pero eso parece un poco avanzado y nunca lo he intentado 🙂

Si desea afirmar que * realmente coincide con los dígitos en ws*.host.com y desea usar case y case lugar de if , elif , elif … puede usar algo como eso:

 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 

Pero eso no funciona para más de 999 servidores.

Si tuviera que hacer un script para este caso de uso, probablemente escriba algo así (porque me encantan las expresiones regulares y la syntax de mayúsculas y minúsculas;)):

 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 

case solo puede usar globs. Si quieres hacer una coincidencia de expresiones regulares, entonces necesitarás usar una serie de instrucciones if-then-else-elif-fi , con [[ .

También puede usar expr para hacer la coincidencia; proporciona una syntax de expresión regular similar a grep que debería ser lo suficientemente robusta para esta aplicación.

 #!/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 

Aquí hay un ejemplo de cómo usar la construcción 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 

Encuentro más confiable almacenar las expresiones regulares en sus propias variables.