Négation pendant la condition de boucle dans bash

25

Dans une partie du script sur lequel je travaille, je veux valider que l'adresse IP entrée est au format correct. Je veux faire une boucle alors que le format d'entrée n'est PAS correct. Ce qui suit fonctionne pour une boucle alors que le format EST correct.

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

Comment puis-je inverser la situation pour dire que NE correspond PAS au format. J'espérais que !=~cela fonctionnerait, mais j'obtiens une erreur de syntaxe.

Synner
la source
2
Synner, une mise en garde: bien qu'il soit clair que vous écrivez un script interactif, l'immense pouvoir des scripts shell vient de pouvoir faire la même chose avec le même script à la fois de manière interactive et en mode batch. Il sera certainement plus facile à l'avenir (lorsque vous commencerez à utiliser le script comme bloc de construction) d'entrer simplement les options dans la ligne de commande et de retourner immédiatement avec un code de sortie non nul (et un message) si quelque chose ne va pas. Juste mes 2 cents ...
Deer Hunter

Réponses:

60

La solution est si simple, je suis sûr que vous la trouverez toutes drôle.

Pas besoin de travailler sur les détails de la syntaxe de négation, utilisez simplement untilau lieu de while.

lynxlynxlynx
la source
9

Pour comparer la chaîne, il faut utiliser à la !=place de !=~.

De man bash

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

Comme vous utilisez une expression régulière à droite, vous en avez vraiment besoin =~. Vous pouvez choisir de nier l'expression entière.

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

Exemple:

$ 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
la source
Merci pour les réponses rapides. J'ai tenté cela avant de poster, et cela ne se valide pas correctement. Il semble avoir besoin du ~ pour fonctionner correctement lors de la validation qu'il correspond au format.
Synner
@Synner Vérifiez l'édition
Bernhard
Ne fonctionne pas avec bash4.2.42. pastebin.com/0vHh5MMB
manatwork
1
@manatwork Essayez dans un shell non interactif.
Bernhard
@manatwork Voir mon montage
Bernhard