在bash中否定while循环条件

Syn*_*ner 32 bash

在我正在处理的脚本的一部分中,我想验证输入的 IP 地址的格式是否正确。我想在输入格式不正确时进行循环。当格式正确时,以下内容适用于循环。

while  [[  $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
      do
Run Code Online (Sandbox Code Playgroud)

我怎么能把这个转过来说不符合格式。我希望!=~能奏效,但出现语法错误。

lyn*_*ynx 81

解决方案如此简单,我相信你们都会觉得很有趣。

无需为否定语法细节until而烦恼,只需使用while.


Ber*_*ard 9

对于字符串的比较,应该使用!=而不是!=~.

man bash

string1 != string2
          True if the strings are not equal.
Run Code Online (Sandbox Code Playgroud)

当您在右侧使用正则表达式时,您确实需要=~. 您可以选择否定整个表达式。

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

例子:

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)