在bash脚本中,如何使用正则表达式否定一个测试?
在bash脚本中,如何使用正则表达式否定一个测试?
使用GNU bash(版本4.0.35(1)-release (x86_64-suse-linux-gnu)),我想要通过正则表达式来否定一个测试。例如,如果路径不存在,我想要有条件地将一个路径添加到PATH变量中,代码如下:\n
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
\n我确信有很多种方法可以实现这个,但我想知道是否可以以某种方式否定条件,如下所示(错误的方式):\n
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
如何在bash脚本中使用正则表达式来否定一个测试?
在bash脚本中,使用正则表达式来执行条件测试是常见的需求。通常,可以使用`=~`运算符来判断一个字符串是否符合某个正则表达式。但是,有时我们需要对测试结果进行否定,即判断一个字符串是否不符合某个正则表达式。
一个常见的错误做法是直接在正则表达式前加上`!`符号,如下所示:
if ! [[ ${STR} =~ YOUR_REGEX ]]; then
然而,这种写法在某些系统上可能会导致错误。为了确保在所有系统上都能正常工作,最安全的做法是将`!`符号放在`[[ ]]`内部,如下所示:
if [[ ! ${STR} =~ YOUR_REGEX ]]; then
这样,就能正确地判断一个字符串是否不符合某个正则表达式。
通过将`!`符号放在`[[ ]]`内部,我们可以避免在某些系统上出现错误。这是因为在某些系统中,`[[ ]]`条件判断语句内部的`!`符号有特殊的含义,会导致正则表达式匹配失败。
总结起来,使用`[[ ! ${STR} =~ YOUR_REGEX ]]`的形式可以在bash脚本中正确地否定一个正则表达式测试。这种写法可以确保在所有系统上都能正常工作,避免了因特殊字符导致的错误。
在bash脚本中,有时候需要使用正则表达式来进行测试。然而,有时候需要对测试进行否定,即如果测试条件不满足,则执行某些操作。本文将讨论如何在bash脚本中使用正则表达式进行测试的否定。
问题的出现是因为一些人在使用否定测试时遇到了困惑。初学者可能会错误地将否定操作符'!'放置在双方括号'[[ ]]'内部,而实际上应该将其放在外部。正确的写法是'if ! [[ condition ]]'。
以下是一些关于这个的问题:
一位用户提到,他最初写的条件是正确的,只是在'!'和'[[ ]]'之间没有加空格。他建议在两者之间添加一个空格,即'if ! [[ condition ]]'。
另一位用户抱怨说,在处理bash脚本时经常遇到各种特殊字符的问题,而他之前以为只有perl会有这种问题。他表示感到困惑,不知道如何正确放置否定操作符。他感到害怕,好像被一条蟒蛇勒住了肚子。
还有一位用户问是否总是将'!'放在'[[ ]]'之前,而不是在内部,例如'if [[ ! condition ]]。他举了一个例子,说Sublime Text在将'!'放在外部时会显示奇怪的高亮。他还提到,IntelliJ会给出一个警告,提示需要在'!'后面加上一个空格。
最后,有一位用户回答说,确实应该将'!'放在'[[ ]]'之前,而不是在内部。他还指出,其实你也可以将'!'放在双方括号内,只是他个人更喜欢将其放在外部。
要在bash脚本中使用正则表达式进行测试的否定,应该将否定操作符'!'放在双方括号'[[ ]]'之前,并在两者之间加上一个空格。这样可以确保条件测试的正确性,并避免出现一些奇怪的问题。