Negiere while-Loop-Bedingung in bash

25

In einem Teil des Skripts, an dem ich arbeite, möchte ich überprüfen, ob die eingegebene IP-Adresse im richtigen Format vorliegt. Ich möchte eine Schleife machen, während das Eingabeformat NICHT korrekt ist. Das Folgende funktioniert für eine Schleife, während das Format korrekt ist.

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

Wie kann ich das umdrehen, um zu sagen, passt NICHT zum Format. Ich hatte gehofft, !=~dass es funktionieren würde, aber ich erhalte einen Syntaxfehler.

Synner
quelle
2
Synner, ein Hinweis zur Vorsicht: Während klar ist, dass Sie ein interaktives Skript schreiben, kommt die immense Kraft des Shell-Skripts von der Möglichkeit, dasselbe mit demselben Skript sowohl interaktiv als auch im Batch-Modus zu tun. In Zukunft wird es definitiv einfacher sein (wenn Sie das Skript als Baustein verwenden), die Optionen einfach in die Befehlszeile einzugeben und sofort mit einem Exit-Code ungleich Null (und einer Meldung) zurückzukehren, wenn etwas nicht stimmt. Nur meine 2 Cent ...
Deer Hunter

Antworten:

60

Die Lösung ist so einfach, ich bin sicher, Sie werden es alle lustig finden.

Sie müssen sich nicht mit Details zur Negationssyntax auseinandersetzen, untilsondern verwenden statt while.

lynxlynxlynx
quelle
9

Zum Vergleich von Strings sollte man !=anstelle von verwenden !=~.

Von man bash

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

Da Sie rechts einen regulären Ausdruck verwenden, brauchen Sie in der Tat =~. Sie können den gesamten Ausdruck negieren.

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

Beispiel:

$ 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
quelle
Danke für die schnellen Antworten. Ich habe das vor dem Posten versucht und es wird nicht richtig validiert. Es scheint notwendig zu sein, dass ~ auch richtig funktioniert, wenn überprüft wird, ob es zum Format passt.
Synner
@Synner Überprüfen Sie die Bearbeitung
Bernhard
Funktioniert nicht mit bash4.2.42. pastebin.com/0vHh5MMB
Manatwork
1
@manatwork Versuchen Sie es in einer nicht interaktiven Shell.
Bernhard
@manatwork Siehe meine Bearbeitung
Bernhard