如何在 case 语句中捕获回车/换行

如何在 case 语句中捕获回车/换行

我尝试了以下方法,但没有成功,也找不到任何文档。

read Option
case $Option in
    [1] ) echo "1" ;;
    [2] ) echo "2" ;;
    [$'\n'] ) echo "LF" ;;
    [0] ) exit ;;
    * ) echo "Invalid input" ;;
esac

但以下方法有效。

$ x="                                         
> "
$ if [ "$x" = $'\n' ]; then echo "newline"; fi
newline

答案1

由于read只读取单行输入,没有换行符,因此您只想检查空字符串:

read Option
case $Option in
    1 ) echo "1" ;;
    2 ) echo "2" ;;
    "" ) echo "LF" ;;
    0 ) exit ;;
    * ) echo "Invalid input" ;;
esac

[1]1(对于其他单字符类也类似)将相同的字符串与模式匹配。

答案2

read将剥离它。案例陈述本身有效。

#read Option
Option='
'
case "$Option" in
    [1] ) echo "1" ;;
    [2] ) echo "2" ;;
    [$'\n'] ) echo "LF" ;;
    [0] ) exit ;;
    * ) echo "Invalid input" ;;
esac
#Outputs: LF

答案3

尽管我仍然无法找到如何case直接捕获实际的换行符,以下调用外部程序(如sed)。

在下面的示例中,所有空格和不可打印字符都是无效的(空格也是如此),因此我将它们全部替换为文字“”:

case "${Option//[^[:print:]]/ }" in
*\ *)
    # Handle error
    ;;
...
esac

相关内容