2008-11-20 17 views
78

Quiero verificar si una variable tiene un año válido usando una expresión regular. Leyendo el bash manual Entiendo que podría usar el operador = ~¿Cómo uso expresiones regulares en scripts bash?

Mirando el ejemplo a continuación, esperaría ver "no OK" pero veo "OK". ¿Qué estoy haciendo mal?

i="test" 
if [ $i=~"200[78]" ] 
then 
    echo "OK" 
else 
    echo "not OK" 
fi 
+0

posible duplicado de [expresiones regulares fiesta con citas?] (Http: // stackoverflow.com/questions/218156/bash-regex-with-quotes) – outis

+0

Tenga en cuenta que esto estaba fallando debido a la falta de espacios alrededor de '= ~'. – fedorqui

Respuesta

111

Se cambió entre 3,1 y 3,2:

Esta es una descripción concisa de las nuevas características añadido a Bash-3.2 desde el lanzamiento de bash-3.1.

Citando el argumento de cadena para el operador [[command's = ~ ahora fuerza la coincidencia de cadenas, como con los otros operadores de coincidencia de patrones.

lo tanto, utilizar sin las comillas así:

i="test" 
if [[ $i =~ 200[78] ]] ; then 
    echo "OK" 
else 
    echo "not OK" 
fi 
+1

¿Cómo manejo la situación cuando la expresión regular contiene espacios si no puedo citar? Si la expresión regular es, por ejemplo, 'a + b' informará un error de sintaxis ... – Alderath

+5

@Alderath: Usa' a \\ + b' para escapar del espacio y el carácter más. – blinry

8

Se necesitan espacios alrededor del operador = ~

 
i="test" 
if [[ $i =~ "200[78]" ]]; 
then 
    echo "OK" 
else 
    echo "not OK" 
fi 
+2

La respuesta de paxdiablo es correcta, agregar espacios aquí no ayuda (ahora también obtiene "no OK" para 2008, la única cadena que se empareja es literalmente "200 [78]"). –

Cuestiones relacionadas