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

kshまたは、その後(または後で好む可能性がある独自の否定および代替演算子がありますが)、次のことを実行できますbashshopt -s extglobzshset -o kshglobzsh

case $db in
  (!(mssql|postgres))
    echo >&2 "Not a valid database type"
    exit 1
    ;;
esac

ただし、より一般的には、入力検証の場合は、許可したくないすべての項目を一致させるよりも、許可された項目を一致させる方が良いです。後者は一般的なケースではしばしば困難で危険であり(より安全であり)、したがってより信頼できるからです。十分に拒否するのではなく、あまりにも拒否することで後者を実行してください)。

ksh88とksh93の以前のバージョンでは注意してください。

ケース $db in
  (@(mssql | postgres));; #OK
  (*)
    echo >&2 "有効なデータベース・タイプではありません。"
    1番出口
    ;;;
イサク

つまり、Caseステートメントから分離された2つのパターンの@(a|b)代わりに交互パターン演算子を使用しても、リテラル(Bourneシェルから継承されたエラー機能)を含めることは拒否されません。|$db@(mssql|postgres)

関連情報