GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué Regex en Bash funciona solo si es una variable y no directamente?

Esta pregunta ya tiene respuestas aquí :prueba de shell si la cadena de varias líneas contiene un patrón especificado en la última línea

(3 respuestas)
Cerrado hace 3 años.

Entonces, ¿por qué funciona lo siguiente, es decir, imprime la coincidencia:

THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
    echo "Match!"
fi

Pero lo siguiente NO:

if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
    echo "Match!"
fi  

¿Cuál es la diferencia? Es la misma expresión regular

Respuesta aceptada:

No use comillas simples dentro de [[ :

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

Del manual bash de GNU:https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

Nota en particular:

Se puede citar cualquier parte del patrón para obligar a que la parte citada coincida como una cadena .

El manual parece sugerir que se prefiere usar la variable:

Almacenar la expresión regular en una variable de shell suele ser una forma útil de evitar problemas al citar caracteres que son especiales para el shell. A veces es difícil especificar una expresión regular literalmente sin usar comillas, o hacer un seguimiento de las comillas utilizadas por las expresiones regulares mientras se presta atención a la eliminación de comillas del shell. El uso de una variable de shell para almacenar el patrón disminuye estos problemas.


Linux
  1. Navegando por el shell Bash con pushd y popd

  2. Personalización del shell Bash

  3. ¿La diferencia entre un comando incorporado y uno que no lo es?

  4. ¿Por qué Bashrc comprueba si el shell actual es interactivo?

  5. ¿Por qué [a-z] coincide con letras minúsculas en Bash?

¿Por qué el documento principal Shell Here no funciona para el subcomando en Dash pero Bash funciona?

¿Por qué /bin/sh apunta a /bin/dash y no a /bin/bash?

La coincidencia de patrones no funciona en el script bash

¿Por qué Ctrl + V no se pega en Bash (shell de Linux)?

¿Por qué esta expresión regular no funciona en Linux?

¿Por qué el usuario 'bin' necesita un shell de inicio de sesión?