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.