Annulla mentre condizione del loop in bash


25

In parte dello script su cui sto lavorando, voglio confermare che l'indirizzo IP immesso sia nel formato corretto. Voglio fare un ciclo mentre il formato di input NON è corretto. Quanto segue funziona per un ciclo mentre il formato è corretto.

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

Come posso ribaltarlo per dire che NON si adatta al formato. Speravo !=~che funzionasse, ma ricevo un errore di sintassi.


2
Synner, una nota di cautela: mentre è chiaro che stai scrivendo uno script interattivo, l'immenso potere dello scripting della shell deriva dalla capacità di fare la stessa cosa con lo stesso script sia in modo interattivo che in modalità batch. In futuro sarà sicuramente più semplice (quando inizi a utilizzare lo script come blocco predefinito) semplicemente inserire le opzioni nella riga di comando e tornare immediatamente con un codice di uscita diverso da zero (e un messaggio) se qualcosa non va. Solo i miei 2 centesimi ...
Deer Hunter

Risposte:


60

La soluzione è così semplice, sono sicuro che lo troverai divertente.

Non è necessario preoccuparsi dei dettagli della sintassi della negazione, basta usare untilinvece di while.


9

Per il confronto della stringa, si dovrebbe usare al !=posto di !=~.

A partire dal man bash

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

Dato che stai usando un'espressione regolare a destra, hai davvero bisogno =~. Puoi scegliere di negare l'intera espressione.

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

Esempio:

$ 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
$ 

Grazie per le risposte rapide. Ci ho provato prima di pubblicare e non viene validato correttamente. Sembra che il ~ funzioni correttamente anche quando si convalida che si adatta al formato.
Synner,

@Synner Controlla la modifica
Bernhard

Non funziona con bash4.2.42. pastebin.com/0vHh5MMB
arte

1
@manatwork Prova in una shell non interattiva.
Bernhard

@manatwork Vedi la mia modifica
Bernhard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.