bash:if表达式中的正则表达式

bash:if表达式中的正则表达式

在我的 ubuntu 机器上的脚本中,我声明了一个如下的字符串:

DEBUG_PACKAGE_LIST=$(apt-cache search dbg | awk '{ print $1 }' | grep -e "-dbg")

帮助您理解我的问题这里的输出是

echo $DEBUG_PACKAGE_LIST >> debug

下列

if [[ ! $DEBUG_PACKAGE_LIST =~ "[^-a-z0-9]libmagick++5-dbg[a-z]*" ]]; then 
   echo "no contained"; 
fi

回显“不包含”,尽管$DEBUG_PACKAGE_LIST包含字符串“libmagick++5-dbgsym”。你能帮我理解为什么吗?

基本上我的目的是匹配 libmagick++5-dbg,而 libmagick 前面只能有一个空格字符。

答案1

bash3.2 或更高版本中:

shopt -u compat31
[[ ! $DEBUG_PACKAGE_LIST =~ [^-[:alnum:]]'libmagick++5-dbg' ]];

bash3.1中:

[[ ! $DEBUG_PACKAGE_LIST =~ '[^-[:alnum:]]libmagick\+\+5-dbg' ]];

(请注意,这[a-z]*是多余的,因为它也匹配空字符串,因此将始终匹配)。

适用于以下两种情况:

re='[^-[:alnum:]]libmagick\+\+5-dbg'
[[ ! $DEBUG_PACKAGE_LIST =~ $re ]]

答案2

不能引用正则表达式在这样的表达式的右侧(除非您使用bash版本>= 3.0-alpha 且 < 3.2-alpha)。如果这样做,它将被视为文字字符串之间的比较。

此外,Bash 使用扩展正则表达式对于=~,其中+是特殊字符。

答案3

您可以使用 shell 模式而不是正则表达式来完成此操作。在字符串前面添加一个空格,这样您就不需要将第一个元素与其他元素区别对待。

if [[ " $DEBUG_PACKAGE_LIST" = *\ libmagick++5-dbg[a-z]* ]]; then 

(您确定后面的必填字母吗-dbg?包名以 结尾-dbg。)

相关内容