Negar enquanto condição de loop no bash

25

Na 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.

Synner
fonte
2
Synner, uma nota de cautela: embora esteja claro que você está escrevendo um script interativo, o imenso poder do script de shell vem de poder fazer a mesma coisa com o mesmo script de maneira interativa e no modo em lote. Definitivamente será mais fácil no futuro (quando você começar a usar o script como um bloco de construção) simplesmente inserir as opções na linha de comando e retornar imediatamente com um código de saída diferente de zero (e uma mensagem) se algo estiver errado. Apenas meus 2 centavos ...
Caçador dos cervos

Respostas:

60

A solução é tão simples que tenho certeza de que todos acharão engraçado.

Não há necessidade de se preocupar com os detalhes da sintaxe de negação, basta usar em untilvez de while.

lynxlynxlynx
fonte
9

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

A partir de man bash

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

Como você está usando uma expressão regular à direita, você realmente precisa =~. Você pode optar por 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
$ 
Bernhard
fonte
Obrigado pelas respostas rápidas. Eu tentei isso antes de postar e ele não é validado corretamente. Parece que o ~ também deve funcionar corretamente ao validar que se encaixa no formato.
Synner 16/03/2013
@Synner Verifique a edição
Bernhard '
Não funciona com bash4.2.42. pastebin.com/0vHh5MMB
manatwork
1
@manatwork Experimente um shell não interativo.
Bernhard
@manatwork Veja minha edição
Bernhard '