Bash:Case 语句与给定字符串不匹配

Bash:Case 语句与给定字符串不匹配

我正在尝试编写一个 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

kshbash之后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 继承的错误功能)。

相关内容