我如何否定bash脚本中的正则expression式testing?

使用GNU bash(version 4.0.35(1)-release(x86_64-suse-linux-gnu),我想否定正则expression式的testing,例如,我想有条件地向PATHvariables添加一个path,如果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 

谢谢!

你说得对,只要在两者之间留出空间![[ if ! [[ if ! [[

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

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

但你应该固定你的模式,以减less误报:

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

它在开头或结尾查找匹配的前面或后面的冒号(或两者)。 我build议使用小写或混合大小写variables名称作为习惯,以减less与shellvariables发生名称冲突的机会。

最安全的方法就是把! 对于[[ ]]的正则expression式否定,就像这样:

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

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

是的,你可以否定这个testing,因为SiegeX已经指出了。

但是,您不应该使用正则expression式 – 如果您的path包含特殊字符,则可能会失败。 试试这个:

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

(资源)

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

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