我正在尝试编写一个 case 语句,其中变量参数与测试表达式不匹配。
换句话说:
case $db in
[Some Code Here])
echo "Not a valid database type"
exit 1
;;
esac
$db 应该仅有的具有值“mssql”或“postgres”,否则脚本应退出。
我如何在案例陈述中做到这一点?
答案1
你会这样做(这甚至是标准sh
语法,所以你甚至不需要bash
安装):
case $db in
(mssql | postgres) ;; # OK
(*)
echo >&2 "Not a valid database type"
exit 1
;;
esac
在ksh
或bash
之后shopt -s extglob
(或zsh
之后set -o kshglob
,尽管zsh
有自己的否定和交替运算符,您可能更喜欢在那里),您可以这样做:
case $db in
(!(mssql|postgres))
echo >&2 "Not a valid database type"
exit 1
;;
esac
但更一般而言,对于输入验证,最好匹配您允许的内容,而不是尝试匹配所有您不想允许的内容,因为后者在一般情况下通常很困难并且风险更高(更安全),因此可靠地进行后者拒绝太多而不是拒绝足够)。
请注意,在 ksh88 和 ksh93 的旧版本中。
案例$db in (@(mssql|postgres)) ;; # 好的 (*) echo >&2“不是有效的数据库类型” 1号出口 ;; 埃萨克
也就是说,使用@(a|b)
交替模式运算符而不是|
在 case 语句中用 分隔开的两个模式)不会拒绝$db
包含@(mssql|postgres)
字面意思的 a (从 Bourne shell 继承的错误功能)。