Article pages now have a discussion option at the bottom (moderated/captcha, but no registration needed)

The case statement

Synopsis

case <WORD> in
  [(] <PATTERN1> ) <LIST1> ;; # or ;& or ;;& in Bash 4
  [(] <PATTERN2> ) <LIST2> ;;
  [(] <PATTERN3> | <PATTERN4> ) <LIST3-4> ;;
  ...
  [(] <PATTERNn>) <LISTn> [;;]
esac

Description

The case-statement can execute commands based on a pattern matching decicion. The word <WORD> is matched against every pattern <PATTERNn> and on a match, the associated list <LISTn> is executed. Every commandlist is terminated by ;;, this rule is optional for the very last commandlist (i.e. you can omit the ;; before the esac).

:V4: Bash 4 introduces new action terminators. The classic behaviour using ;; is to execute the matching block and then terminate. The ;& terminator causes case to also execute the next block, the ;;& operator makes it checking the pattern of the next block for a match. Using these terminators, a case statement can be configured to "run through" all matches, for example.

The word <WORD> is expanded using tilde, parameter and variable expansion, arithmetic, command and process substitution and quote removal, no word splitting is done, which means, you can leave expansions unquoted without problems, like:

var="test word"

case $var in
  ...
esac
This is similar to the behaviour of the conditional expression command ("new test command") (also no word splitting for expansions).

Unlike the C-case-statement, only the matching list and nothing else is executed. If more patterns match the word, only the first match is taken. (Note the comment about :V4: Bash v4 changes above)

More patterns to match for one list to execute are separated by | (pipe symbol).

Examples

Another one of my stupid examples...

read -p "Which fruit do you like most? " fruit

case "$fruit" in
  apple)              echo "Mmmmh... I like those!"
                      ;;
  banana)             echo "Hm, a bit awry, no?"
                      ;;
  orange|tangerine)   echo "Eeeks! I don't like those!"
                      echo "Go away!"
                      exit 1
                      ;;
  *)                  echo "Unknown fruit - sure it isn't toxic?"
                      # this ;; is optional as it's the last one!
                      ;;
esac

Portability considerations

See also

Discussion

Enter your comment
 
syntax/ccmd/case.txt · Last modified: 2010/04/15 20:43 by thebonsai
GNU Free Documentation License 1.2
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0