Negar mientras la condición del bucle en bash

25

En parte del script en el que estoy trabajando, quiero validar que la dirección IP ingresada esté en el formato correcto. Quiero hacer un bucle mientras el formato de entrada NO es correcto. Lo siguiente funciona para un bucle mientras el formato ES correcto.

while  [[  $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
      do

¿Cómo puedo cambiar esto para decir que NO encaja en el formato? Esperaba !=~que funcionara, pero recibo un error de sintaxis.

Synner
fuente
2
Synner, una nota de precaución: si bien está claro que está escribiendo una secuencia de comandos interactiva, el inmenso poder de las secuencias de comandos de shell proviene de poder hacer lo mismo con la misma secuencia de comandos tanto de forma interactiva como en modo por lotes. Definitivamente será más fácil en el futuro (cuando comience a usar el script como un bloque de construcción) simplemente ingrese las opciones en la línea de comando y regrese inmediatamente con un código de salida distinto de cero (y un mensaje) si algo está mal. Solo mis 2 centavos ...
Deer Hunter

Respuestas:

60

La solución es tan simple, estoy seguro de que todos lo encontrarán divertido.

No es necesario preocuparse por los detalles de la sintaxis de negación, solo use en untillugar de while.

lynxlynxlynx
fuente
9

Para la comparación de la cadena, se debe usar en !=lugar de !=~.

Desde man bash

string1 != string2
          True if the strings are not equal.

Como está utilizando una expresión regular a la derecha, de hecho lo necesita =~. Puedes elegir negar toda la expresión.

while  [[  !( $range =~ ^[0-9]{1,3]}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]

Ejemplo:

$ bash --version | head -n1
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
$ cat script
range='1'; while [[ !( $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]; do echo "$range NOT OK"; range+='.2'; sleep 1; done
echo "Finished"
$ bash script
1 NOT OK
1.2 NOT OK
1.2.2 NOT OK
Finished
$ 
Bernhard
fuente
Gracias por las rápidas respuestas. He intentado eso antes de publicar, y no se valida correctamente. Parece que también necesita ~ para funcionar correctamente al validar que NO se ajusta al formato.
Synner
@Synner Compruebe la edición
Bernhard
No funciona con bash4.2.42. pastebin.com/0vHh5MMB
manatwork
1
@manatwork Pruébelo en un shell no interactivo.
Bernhard
@manatwork Ver mi edición
Bernhard