複数または文で条件を単純化する方法は?

複数または文で条件を単純化する方法は?

パラメータが文字列と一致することを確認するためにシェルスクリプトを作成しています。約20個ほどあり、今後さらに追加する必要があるかもしれません。

現在、私が書く方法は読みにくく、更新するのが面倒です。私はシェルスクリプティングに慣れていないので、これを単純化し管理するのが簡単な最善の方法を知りません。

if [ $4 =="CRITICAL" ] && [[ $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || ]]
  VARIABLE=1
fi

上記のスクリプトでは、Fooとbarは両方とも異なる文字列です。

答え1

標準シェルでは、case代替をサポートするを使用できます。

#!/bin/sh
if [ "$4" = CRITICAL ]; then
        case $2 in
        foo|bar|doo|quux)
                VARIABLE=1
                ;;
        esac
fi

上記の5行がcase長すぎる場合は、1行に書きます。

 case $2 in foo|bar|doo|quux) VARIABLE=1;; esac

これは==Bashの標準ではありませんが、[ .. ]Bashとkshでサポートされています。

答え2

if [[ $4 == CRITICAL && $2 =~ ^(a|b|c|d|e|f|g)$ ]]; then
  VARIABLE=1
fi

ところで、引用符のない変数と位置パラメータは内部的に使用しても安全ですが[[ ... ]][ ... ]つまり[ $4 == "CRITICAL" ]では[ "$4" == "CRITICAL" ]

また、CRITICAL上記では引用はまったく必要ありません。スペースやシェルのメタ文字を持たない固定文字列です。何らかの理由で実際に引用符が必要な固定文字列である場合は、単一引用符を使用することをお勧めします。

一重引用符は文字列を変更するために使用され、二重引用符は文字列に変数、コマンド置換などを挿入するときに使用されます。

答え3

caseたぶん関数と組み合わせたステートメントを使うことができますか?

function a_func){ ... }
function b_func(){ ... }

case "${1}" in
  "${4}" == "CRITICAL" && $(echo "${2}" | egrep -n 'a|b|c|d|e|f|g') -gt 0))
    a_func ;;
  *)
    b_func ;;
esac

擬似コードですが、方向を案内する必要があります。

関連情報