切换机箱有穿透?

时间:2011-04-06 06:25:57

标签: bash

我正在寻找switch语句的正确语法,其中包含Bash中的初级案例(理想情况下不区分大小写)。 在PHP中,我会像以下一样编程:

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

我想在Bash中使用相同的内容:

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

这在某种程度上不起作用:当$ C为2或3时,应该触发函数do_what_you_are_supposed_to_do()

5 个答案:

答案 0 :(得分:269)

使用竖线(|)表示“或”。

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

答案 1 :(得分:79)

最新的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

答案 2 :(得分:24)

  • 除非您想定义它们,否则不要在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

答案 3 :(得分:11)

试试这个:

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

答案 4 :(得分:9)

如果值为整数,则可以使用[2-3],或者可以将[5,7,8]用于非连续值。

#!/bin/bash
while [ $# -gt 0 ];
do
    case $1 in
    1)
        echo "one"
        ;;
    [2-3])
        echo "two or three"
        ;;
    [4-6])
        echo "four to six"
        ;;
    [7,9])
        echo "seven or nine"
        ;;
    *)
        echo "others"
        ;;
    esac
    shift
done

如果值是字符串,那么您可以使用|

#!/bin/bash
while [ $# -gt 0 ];
do
    case $1 in
    "one")
        echo "one"
        ;;
    "two" | "three")
        echo "two or three"
        ;;
    *)
        echo "others"
        ;;
    esac
    shift
done