Negar enquanto a condição de loop no bash

21

Em parte do script em que estou trabalhando, quero validar se o endereço IP inserido está no formato correto. Eu quero fazer um loop enquanto o formato de entrada não está correto. O seguinte funciona para um loop enquanto o formato está correto.

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

Como posso mudar isso para dizer NÃO se encaixa no formato. Eu esperava que !=~ funcionasse, mas estou recebendo um erro de sintaxe.

    
por Synner 16.03.2013 / 19:21

2 respostas

48

A solução é tão simples que, com certeza, vocês acharão engraçado.

Não é preciso se preocupar com os detalhes da sintaxe de negação, basta usar until em vez de while .

    
por 16.03.2013 / 23:58
9

Para comparação de string, deve-se usar != em vez de !=~ .

De man bash

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

Como você está usando uma expressão regular à direita, você realmente precisa de =~ . Você pode escolher negar toda a expressão.

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

Exemplo:

$ 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
$ 
    
por 16.03.2013 / 19:32

Tags