在bash中对while循环条件求反


25

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

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

我该如何转转说不适合该格式。我希望!=~可以使用,但是出现语法错误。


2
Synner,请注意:在编写交互式脚本时,很明显,shell脚本的强大功能来自能够以交互方式和以批处理方式对同一脚本执行相同的操作。将来(当您开始使用脚本作为构建块时)绝对肯定会更容易,只要在命令行中输入选项,然后在出现任何错误时立即以非零的退出代码(和一条消息)返回。只是我的2美分……
猎鹿人2013年

Answers:


60

解决方案是如此简单,我相信你们都会发现它很有趣。

无需费心处理否定语法细节,只需使用until代替即可while


9

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

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
$ 

感谢您的快速回复。我已经尝试过,然后再发布,但验证不正确。在验证它是否适合格式时,它似乎也需要〜才能正常工作。
Synner 2013年

@Synner检查编辑
Bernhard

不适用于bash4.2.42。pastebin.com/0vHh5MMB
manatwork 2013年

1
@manatwork在非交互式外壳中尝试。
伯恩哈德2013年

@manatwork参见我的编辑
Bernhard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.