Bash案例声明搜索两个不同的字符串?

时间:2011-10-20 02:51:22

标签: regex bash case

我不知道形成这个问题的最佳方法,但这是我想要的代码:

case $MESSAGE in
    ?Trcx!~*PRIVMSG*[${Nick}|${AltNick}]*[nN][mM]ap*)
       echo "Some Code";;
     *)
       echo "Some Other Code";;
esac

我怎样才能让它发挥作用?不起作用的部分是[$ {Nick} | $ {AltNick}]我希望表达式对$ Nick和$ AltNick var都有效。任何帮助是极大的赞赏!

3 个答案:

答案 0 :(得分:2)

Bash glob模式是documented here。 你想要这个:@(patt1|patt2)。 请注意,必须启用extglob shell选项。

shopt -s extglob
case $MESSAGE in
    ?Trcx!~*PRIVMSG*@(${Nick}|${AltNick})*[nN][mM]ap*)
       echo "Some Code";;
     *)
       echo "Some Other Code";;
esac

答案 1 :(得分:2)

在glob模式中,如果没有Bash的“extglob”功能,则不能使用括号对子模式进行分组 - 当然也不能使用方括号。与Bourne兼容的方式是分成两种不同的模式。

case $MESSAGE in
  ?Trcx!~*PRIVMSG*${Nick}*[nN][mM]ap* |
  ?Trcx!~*PRIVMSG*${AltNick}*[nN][mM]ap*)
    echo "Some Code";;
  *)
    echo "Some Other Code";;
esac

答案 2 :(得分:1)

Bash执行大小写匹配,就像文件名匹配一样,而不是正则表达式匹配。如果这就是你想要的,那么问题就解决了。

但是,如果你想要一个正则表达式匹配,也许你可以尝试[[expression]]复合命令来实现你的目标,它为正则表达式匹配提供了=〜运算符。

#!/bin/bash

regexp="^[a-z]*$"
if [[ $1 =~ $regexp ]] ; then                                                                                                                                                                   
   echo "match"
else
   echo "no match"
fi