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
.
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.
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
.
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
$
Tags bash