我不知道形成这个问题的最佳方法,但这是我想要的代码:
case $MESSAGE in
?Trcx!~*PRIVMSG*[${Nick}|${AltNick}]*[nN][mM]ap*)
echo "Some Code";;
*)
echo "Some Other Code";;
esac
我怎样才能让它发挥作用?不起作用的部分是[$ {Nick} | $ {AltNick}]我希望表达式对$ Nick和$ AltNick var都有效。任何帮助是极大的赞赏!
答案 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