パラメータが文字列と一致することを確認するためにシェルスクリプトを作成しています。約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
擬似コードですが、方向を案内する必要があります。