This is an old revision of the document!
The case statement
case <WORD> in [(] <PATTERN1> ) <LIST1> ;; # or ;& or ;;& in Bash 4 [(] <PATTERN2> ) <LIST2> ;; [(] <PATTERN3> | <PATTERN4> ) <LIST3-4> ;; ... [(] <PATTERNn>) <LISTn> [;;] esac
case-statement can execute commands based on a pattern matching decision. 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
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.
<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 ... esacThis 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 Bash v4 changes above)
More patterns to match for one list to execute are separated by
| (pipe symbol).
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?" ;; esac