bash 中的 while 循环条件取反

bash 中的 while 循环条件取反

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

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

我怎样才能扭转这个局面,说不符合格式。我希望!=~能起作用,但我遇到了语法错误。

答案1

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

无需担心否定语法细节,只需使用until而不是while.

答案2

为了比较字符串,应该使用!=代替!=~.

man bash

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

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

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

例子:

$ 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
$ 

答案3

只需输入“!”在声明之前,例如:

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

相关内容