如何在bash脚本中使用正则表达式否定测试?

使用GNU bash (version 4.0.35(1)-release (x86_64-suse-linux-gnu),我想用正则表达式否定一个测试。例如,我想有条件地为path变量添加一个路径,如果路径还不存在,如:

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

我相信有一百万种方法可以做到这一点,但我想知道的是条件句是否可以以某种方式被否定,就像在(错误的)中那样:

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
192300 次浏览

是的,你可以否定测试,正如SiegeX已经指出的那样。

但是你不应该为此使用正则表达式——如果你的路径包含特殊字符,它可能会失败。试试这个吧:

[[ ":$PATH:" != *":$1:"* ]]

39995年< a href = " https://superuser.com/questions/39751/add-directory-to-path-if-its-not-already-there/39995 " >(源)< / >

你做对了,只要在![[之间放一个空格,比如if ! [[

你也可以把感叹号放在括号里:

if [[ ! $PATH =~ $temp ]]

但你应该固定你的模式来减少误报:

temp=/mnt/silo/bin
pattern="(^|:)$temp(:|$)"
if [[ ! $PATH =~ $pattern ]]

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

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

if [[ ! ${STR} =~ YOUR_REGEX ]]; then

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

我喜欢在这种情况下不使用条件操作符来简化代码:

TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP