在我正在编写的脚本的一部分中,我想验证输入的 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