首页 > 解决方案 > 带有';;&'的linux zsh shell中的'case':在'&'附近解析错误

问题描述

这个例子在我正在关注的 linux 书中给出,如果输入匹配多个案例,则显示多个输出。这本书使用的是 bash shell,但我使用的是 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

输出应该是字母数字大小写和小写字母。但显示的错误是:

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

任何人都可以提供解决方案吗?

标签: linuxzsh

解决方案


In bash,;;&导致case语句测试下一个模式而不是退出case语句。

zsh中,对应的终止符是;|

两者bashzsh用于;;终止case语句 ad;&以执行与下一个模式关联的列表,无论该模式是否实际匹配。

最后的case语句应该是这样的:

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

不管或不upper匹配loweralnum都能匹配。但如果alnum成功,你不想继续前进*,所以使用常规;;终止符。

~ % 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.

推荐阅读