我如何否定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