我想捕获 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
标签后面也不需要。
测试(从交互式zsh
shell,这是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 中进行了测试。