Dav*_*ers 153 regex bash conditional negate
使用GNU bash(版本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
Run Code Online (Sandbox Code Playgroud)
我确信有一百万种方法可以做到这一点,但我想知道的是,条件是否可以以某种方式被否定,如(错误的):
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
Run Code Online (Sandbox Code Playgroud)
Sie*_*geX 170
你说得对,只是把之间的空间!和[[类似if ! [[
Pau*_*ce. 110
您还可以将感叹号放在括号内:
if [[ ! $PATH =~ $temp ]]
Run Code Online (Sandbox Code Playgroud)
但你应该锚定你的模式以减少误报:
temp=/mnt/silo/bin
pattern="(^|:)$temp(:|$)"
if [[ ! $PATH =~ $pattern ]]
Run Code Online (Sandbox Code Playgroud)
它在开头或结尾处用冒号(或两者)之前或之后查找匹配.我建议使用小写或混合大小写变量名作为习惯,以减少名称与shell变量冲突的可能性.
小智 17
最安全的方法是把!对于这样的正则表达式否定[[ ]]:
if [[ ! ${STR} =~ YOUR_REGEX ]]; then
Run Code Online (Sandbox Code Playgroud)
否则它可能在某些系统上失败.
是的,你可以否定测试,因为SiegeX已经指出.
但是,您不应该使用正则表达式 - 如果您的路径包含特殊字符,它可能会失败.试试这个:
[[ ":$PATH:" != *":$1:"* ]]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我喜欢在不使用条件运算符的情况下简化代码:
TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP
Run Code Online (Sandbox Code Playgroud)