235

使用 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

我敢肯定有一百万种方法可以做到这一点,但我想知道的是是否可以以某种方式否定条件,例如(错误的):

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
4

5 回答 5

270

你说得对,只是在!和之[[类之间放一个空格if ! [[

于 2010-12-28T00:00:12.717 回答
162

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

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

但是您应该锚定您的模式以减少误报:

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

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

于 2010-12-28T02:17:06.613 回答
25

最安全的方法是放!对于这样的正则表达式否定[[ ]]

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

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

于 2011-10-21T07:32:38.613 回答
10

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

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

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

(资源)

于 2010-12-28T00:00:10.420 回答
7

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

TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP
于 2017-10-04T09:00:52.323 回答