首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在bash脚本中取消使用正则表达式的测试?

如何在bash脚本中取消使用正则表达式的测试?
EN

Stack Overflow用户
提问于 2010-12-28 07:53:48
回答 5查看 167.5K关注 0票数 225

使用GNU bash (版本4.0.35(1)-release (x86_64-suse-linux-gnu) ),我想否定一个使用正则表达式的测试。例如,我希望有条件地将路径添加到path变量,如果该路径尚未存在,则如下所示:

代码语言:javascript
复制
TEMP=/mnt/silo/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
export PATH

我确信有一百万种方法可以做到这一点,但我想知道的是,条件条件是否可以以某种方式被否定,比如(the erroneous):

代码语言:javascript
复制
TEMP=/mnt/silo/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
export PATH
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-28 08:00:13

你说得对,就像if ! [[一样,在![[之间加一个空格

票数 257
EN

Stack Overflow用户

发布于 2010-12-28 10:17:07

您还可以将感叹号放在括号内:

代码语言:javascript
复制
if [[ ! $PATH =~ $temp ]]

但你应该锚定你的模式,以减少误报:

代码语言:javascript
复制
temp=/mnt/silo/bin
pattern="(^|:)${temp}(:|$)"
if [[ ! "${PATH}" =~ ${pattern} ]]

它在开头或结尾查找前面或后面有冒号的匹配项(或两者都有)。我建议使用小写或大小写混合的变量名作为习惯,以减少与shell变量的名称冲突的机会。

票数 160
EN

Stack Overflow用户

发布于 2011-10-21 15:32:39

最安全的方法是把!对于[[ ]]中的正则表达式否定,如下所示:

代码语言:javascript
复制
if [[ ! ${STR} =~ YOUR_REGEX ]]; then

否则,它可能会在某些系统上失败。

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

https://stackoverflow.com/questions/4542732

复制
相关文章

相似问题

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