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.


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.


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
$ 

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 '
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.