首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IF语句中的Linux或运算符没有按预期工作

IF语句中的Linux或运算符没有按预期工作
EN

Unix & Linux用户
提问于 2020-07-10 09:48:09
回答 1查看 187关注 0票数 2

假设有两个主机有不同的命名约定..。

ab_01ab_cd

我想确保他们的命名惯例符合一定的标准。

所以,我编写了一个简单的脚本来测试它。

代码语言:javascript
运行
复制
wolf@linux:~$ host='ab_01'

wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] ]]; then echo True; else echo False; fi
False

wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[0-9][0-9] ]]; then echo True; else echo False; fi
True

它起作用了!

下一步是将这2正则表达式与Shell中的OR运算符(即|| )结合起来

代码语言:javascript
运行
复制
if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
then
    echo True
else
    echo False
fi

让我们来测试一下

代码语言:javascript
运行
复制
wolf@linux:~$ echo $host
ab_01
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
>     echo True
> else
>     echo False
> fi
True
wolf@linux:~$

它同时适用于ab_01ab_cd

但是,当我在主机名中添加更多字符时,当它应该是假的时候,我仍然得到True。

让我们用host='ab_0123'host='ab_cdef'来测试这个

代码语言:javascript
运行
复制
wolf@linux:~$ host='ab_0123'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
>     echo True
> else
>     echo False
> fi
True
wolf@linux:~$ 

另一个测试也显示了True而不是False

代码语言:javascript
运行
复制
wolf@linux:~$ host='ab_cdef'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
>     echo True
> else
>     echo False
> fi
True
wolf@linux:~$ 

这段代码有什么问题,以及如何修复?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-07-10 09:55:30

与模式匹配不同,regex匹配没有锚定以启动/结束字符串,因此字符串中任何位置的匹配就足够了。(它更像“搜索”而不是“匹配”,我认为某些Python函数名做出了区别。) ab_cdef包含匹配的ab_cd

您必须使用^$显式锚定模式:

代码语言:javascript
运行
复制
$ if [[ foobar =~ o ]]; then echo yes; else echo no; fi
yes
$ if [[ foobar =~ ^o$ ]]; then echo yes; else echo no; fi
no

||不同,您还可以将替换放在regex中:

代码语言:javascript
运行
复制
re='^[a-z][a-z]_([0-9][0-9]|[a-z][a-z])(或用于允许ab_a0:^[a-z][a-z]_[0-9a-z][0-9a-z]$.)
if [[ $host =~ $re ]]; then ...

(或用于允许D7D8.)

票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/597724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档