POSIX 在 case 语句中捕获换行符

POSIX 在 case 语句中捕获换行符

我想捕获 POSIX shell 中 case 语句中的变量是否为多行(破折号)。

我试过这个:

q='
'
case "$q" in
    *$'\n'*) echo nl;;
    *) echo NO nl;;
esac

nl以 zsh 形式返回,但NO nl以 dash 形式返回。

谢谢。

答案1

shelldash没有 C 字符串 ( $'...')。 C 字符串是 POSIX 标准的扩展。您必须使用文字换行符。如果将换行符存储在变量中,这会更容易(并且看起来更好):

#!/bin/dash

nl='
'

for string; do

    case $string in
        *"$nl"*)
            printf '"%s" contains newline\n' "$string"
            ;;
        *)
            printf '"%s" does not contain newline\n' "$string"
    esac

done

对于提供给脚本的每个命令行参数,这会检测它是否包含换行符。case语句( )中使用的变量$string不需要引号,并且;;最后一个case标签后面也不需要。

测试(从交互式zshshell,这是dquote>辅助提示符的来源):

$ dash script.sh "hello world" "hello
dquote> world"
"hello world" does not contain newline
"hello
world" contains newline

答案2

您可以包含文字换行符(在引号中)作为模式,就像分配给变量时所做的那样:

q='
'
case "$q" in
    *'
'*) echo nl;;
    *) echo NO nl;;
esac

这使得格式变得丑陋(你不能缩进结束引号),但应该是完全可移植的。我在 bash、zsh、ksh 和 dash 中进行了测试。

相关内容