2011-04-06 74 views
98

我正在寻找开关语句的正确语法与在Bash(理想情况下不区分大小写)传递案件。 在PHP我会编程,它想:切换案例与fallthrough?

switch($c) { 
    case 1: 
     do_this(); 
     break; 
    case 2: 
    case 3: 
     do_what_you_are_supposed_to_do(); 
     break; 
    default: 
     do_nothing(); 
} 

我希望同样的击:

case "$C" in 
    "1") 
     do_this() 
     ;; 
    "2") 
    "3") 
     do_what_you_are_supposed_to_do() 
     ;; 
    *) 
     do_nothing(); 
     ;; 
esac 

这不知何故不工作:功能do_what_you_are_supposed_to_do()应该被解雇时,$ C是2或3。

+2

不使用通话功能与括号!既然你可以在bash中使用'function fname {echo“Inside fname”;返回0; }'或'fname(){echo“inside fname”;}返回0; }'把parens放在一个函数调用上看起来像是一个函数定义。函数应该像任何其他命令行程序一样被调用,例如'mv','cp','rsync','ls','cd'等等......在这种情况下,我们调用fname如下:'fname $ ARGS' 。 – 2015-12-17 17:36:04

+0

'do_nothing()'应该是一个SKIP语句?使用':'。 – sjas 2016-07-21 12:01:45

回答

176

对“或”使用垂直条(|)。

case "$C" in 
"1") 
    do_this() 
    ;; 
"2" | "3") 
    do_what_you_are_supposed_to_do() 
    ;; 
*) 
    do_nothing() 
    ;; 
esac 
+19

或在这种情况下,简单的字符类'[23])' – SiegeX 2011-04-06 06:50:20

22
  • ,除非你想定义他们不要使用()落后于bash函数名。
  • 使用[23]万一匹配23
  • 静态字符串的情况下应该由''括代替""

如果封闭在"",解释器(不必要)试图扩大在值的可能变量匹配前。

case "$C" in 
'1') 
    do_this 
    ;; 
[23]) 
    do_what_you_are_supposed_to_do 
    ;; 
*) 
    do_nothing 
    ;; 
esac 

对于不区分大小写的匹配,可以使用字符类(如[23]):

case "$C" in 

# will match C='Abra' and C='abra' 
[Aa]'bra') 
    do_mysterious_things 
    ;; 

# will match all letter cases at any char like `abra`, `ABRA` or `AbRa` 
[Aa][Bb][Rr][Aa]) 
    do_wild_mysterious_things 
    ;; 

esac 

abra没有击中任何时间,因为它会通过第一种情况相匹配。

如果需要,您可以在第一种情况下省略;;以在下列情况下继续测试匹配项。 (;;跳到esac

+0

您还可以将C至小写'案“$ {C} ,,” in'如果案件并不重要 – Sprinterfreak 2014-03-22 12:02:55

+0

如果你省略了,会发生什么'';;?你不应该使用';&'来实现穿越吗? – HelloGoodbye 2016-01-22 16:21:45

+0

如果我省略';;'我需要使用';;&',如果我想继续测试,则会出现语法错误。 – Jasen 2016-10-27 20:53:33

45

最近bash版本允许秋季,通过在;;代替使用;&: 它们还允许通过使用;;&有恢复的情况下检查。

for n in 4 14 24 34 
do 
    echo -n "$n = " 
    case "$n" in 
    3?) 
    echo -n thirty- 
    ;;& #resume (to find ?4 later) 
    "24") 
    echo -n twenty- 
    ;& #fallthru 
    "4" | ?4) 
    echo -n four 
    ;;& # resume (to find teen where needed) 
    "14") 
    echo -n teen 
    esac 
    echo 
done 

样本输出

4 = four 
14 = fourteen 
24 = twenty-four 
34 = thirty-four 
8

试试这个:

case $VAR in 
normal) 
    echo "This doesn't do fallthrough" 
    ;; 
special) 
    echo -n "This does " 
    ;& 
fallthrough) 
    echo "fall-through" 
    ;; 
esac 
+0

这是一个非常有用的提示。至少对于Bash 4.3.11来说。我没有打扰过任何其他人尝试。 – Daniel 2015-12-06 04:50:00

+0

谢谢谢谢谢谢谢谢! – 2016-07-18 07:39:55

+1

注意:这对于bash 3.2不起作用,它仍然是macOS中的默认bash。 – 2016-10-26 16:44:04