2011-10-20 291 views
1

动态Case语句我怎么会去写:在猛砸

PreviousInput='@(User1 | User2 | User3)*#channel' 
############################### 
Expression="*${PreviousInput}*" 
case $Input in 
    $Expression) 
     Do_Something ;; 
    *) 
     Do_Something_Else ;; 
esac 

我真的想用一个case语句,因为我有很多已经投资的case语句逻辑的,真不想重写它。我在想,我可以使用全局模式,但不知道我会怎么做。有什么建议么?任何帮助表示赞赏。

+0

请修改您的问题,以包含$ {PreviousInput}的示例数据。祝你好运! – shellter

+0

补充说,PreviousInput字符串是动态生成的,所以字符串会改变,但这是一个很好的示例。 – Trcx

+0

根据你之前关于这个主题的问题,你正在使用'shopt -s extglob'?如果你幸运的话,你可能会用“eval”来包装整个多线的状态,但是需要一个前导和一个结束的dbl-quote来描述整个事情。如果需要在$ {Expression}值附近添加dbl引号,则需要转义这些引号,即'\“$ {Expression \”'。所以...''eval“case $ Input在\”$ {Expression | \“)...; esac”'中。并逃离你的'*'。这种方法可以很快得到真正的效果。您必须花时间了解eval,shell cmd命令行的评估顺序等。祝您好运。 – shellter

回答

0

bash的手册说:

检查使用波浪线扩展,参数和 变量扩展,算术替代,命令替换 和工艺替代膨胀每个模式。

所以我看不出有任何理由,你的榜样不应该是完全等同于

case $Input in 
    *@(User1 | User2 | User3)*#channel*) 
     Do_Something ;; 
    *) 
     Do_Something_Else ;; 
esac 

应该做你想做的,只要你有shopt -s extglob集,shellter说。