Home > OS >  'case' in linux zsh shell with ';;&' : parse error near `&'
'case' in linux zsh shell with ';;&' : parse error near `&'

Time:10-21

This example is given in the linux book which I'm following to show multiple outputs if the input matches multiple cases. The book is using bash shell but I'm using zsh shell.

#! /bin/zsh

# testing the 'case' syntax of zsh

read \?"enter a character: " 

case "$REPLY" in
 
    [[:upper:]])    echo "The input is an uppercase letter.";;&
    [[:lower:]])    echo "The input is a lowercase letter.";;&
    [[:alpha:]])    echo "The input is an alphanumeric letter.";;&
    *)              echo "Input is invalid.";;&
esac

The output should be both the alphanumeric case and lowercase letter. but what the error showing is:

enter a character : f
/home/user/bin/case_testing.sh:9: parse error near `&'

Can anyone kindly provide the solution?

CodePudding user response:

In bash, ;;& causes the case statement to test the next pattern instead of exiting the case statement.

In zsh, the corresponding terminator is ;|.

Both bash and zsh use ;; to terminate the case statement ad ;& to execute the list associated with the next pattern, whether or not that pattern actually matches.

The final case statement should look like this:

case "$REPLY" in

    [[:upper:]])    echo "The input is an uppercase letter." ;|
    [[:lower:]])    echo "The input is a lowercase letter." ;|
    [[:alnum:]])    echo "The input is an alphanumeric letter." ;;
    *)              echo "Input is invalid." ;;
esac

Whether or not upper or lower match, alnum could match. But if alnum succeeds, you don't want to move on to *, so use the regular ;; terminator.

~ % zsh tmp.sh <<< f
The input is a lowercase letter.
The input is an alphanumeric letter.
~ % zsh tmp.sh <<< F
The input is an uppercase letter.
The input is an alphanumeric letter.
~ % zsh tmp.sh <<< 3
The input is an alphanumeric letter.
~ % zsh tmp.sh <<< "#"
Input is invalid.
  • Related