Switch case with fallthrough?

前端 未结 5 881
一生所求
一生所求 2020-12-04 07:43

I am looking for the correct syntax of the switch statement with fallthrough cases in Bash (ideally case-insensitive). In PHP I would program it like:

switch         


        
相关标签:
5条回答
  • 2020-12-04 08:08
    • Do not use () behind function names in bash unless you like to define them.
    • use [23] in case to match 2 or 3
    • static string cases should be enclosed by '' instead of ""

    If enclosed in "", the interpreter (needlessly) tries to expand possible variables in the value before matching.

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

    For case insensitive matching, you can use character classes (like [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
    

    But abra didn't hit anytime because it will be matched by the first case.

    If needed, you can omit ;; in the first case to continue testing for matches in following cases too. (;; jumps to esac)

    0 讨论(0)
  • 2020-12-04 08:18

    Use a vertical bar (|) for "or".

    case "$C" in
    "1")
        do_this()
        ;;
    "2" | "3")
        do_what_you_are_supposed_to_do()
        ;;
    *)
        do_nothing()
        ;;
    esac
    
    0 讨论(0)
  • 2020-12-04 08:21

    Recent bash versions allow fall-through by using ;& in stead of ;;: they also allow resuming the case checks by using ;;& there.

    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" | [13]4)
         echo -n four 
         ;;&  # resume ( to find teen where needed )
       "14" )
         echo -n teen
      esac
      echo 
    done
    

    sample output

    4 = four
    14 = fourteen
    24 = twenty-four
    34 = thirty-four
    
    0 讨论(0)
  • 2020-12-04 08:22

    Try this:

    case $VAR in
    normal)
        echo "This doesn't do fallthrough"
        ;;
    special)
        echo -n "This does "
        ;&
    fallthrough)
        echo "fall-through"
        ;;
    esac
    
    0 讨论(0)
  • 2020-12-04 08:32

    If the values are integer then you can use [2-3] or you can use [5,7,8] for non continuous values.

    #!/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
    

    If the values are string then you can use |.

    #!/bin/bash
    while [ $# -gt 0 ];
    do
        case $1 in
        "one")
            echo "one"
            ;;
        "two" | "three")
            echo "two or three"
            ;;
        *)
            echo "others"
            ;;
        esac
        shift
    done
    
    0 讨论(0)
提交回复
热议问题