regulares online expresiones regex bash case globbing

regex - online - Expresiones regulares en una declaración de caso Bash



regex converter (5)

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 :-)

Estoy usando la siguiente secuencia de comandos, que usa la declaración 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 ?


También puede usar expr para hacer la coincidencia; proporciona una sintaxis 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


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 una secuencia de comandos para este caso de uso, probablemente escriba algo así (porque me encantan las expresiones regulares y la sintaxis de casos;)):

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 [[ .


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.