Bash変数で関連する一連の値をテストします。

Bash変数で関連する一連の値をテストします。

この質問への回答が以前にあった場合はお詫び申し上げます。しかし、オンラインで多くの情報が見つかりません。

これが私が達成したいものです:

if [[ "${hostname}" = (foo | bar)servername(01 | 02 | 03) ]]; then
  var="foobarfoo"
fi

したがって、fooservername01、barservername02、fooservername03、barservername03などは条件を満たします。

私ははるかに効率が悪い方法でこれをしました。

if [[ ${hostname} == "fooservername01" ]] || [[ ${hostname} == "fooservername02" ]] || [[ ${hostname} == "fooservername03" ]] || [[ ${hostname} == "barservername01" ]] || [[ ${hostname} == "barservername02" ]] || [[ ${hostname} == "barservername03" ]]; then
  var="foobarfoo"
fi

しかし、コードを最適化/簡素化したいと思います。

私はまだbashスクリプトや一般的なスクリプトについてはあまり慣れていないので、どんな洞察力にも感謝します。

答え1

あなたが書いたものとほぼ同じことができます。使用するとき[[それから==使用パターンマッチング右側にあります。 Bashモードでは、以下を使用してパターンセットの1つを一致させることができます@(a|b|c)

if [[ "${hostname}" = @(foo|bar)servername@(01|02|03) ]]; then

これはあなたが識別したすべてのケースと一致します。@( ... | ... )次の|分離パターンと一致します。あなたまたできる他のグローブ*?追加の複合[character classes]パターンを使用して、繰り返し、選択、または負のパターンを実装します。

これらの拡張モードを使用するには、extglobシェルオプションを有効にする必要があります。まだ有効になっていない場合(構文エラーが発生した場合)、次の方法で有効にできます。

shopt -s extglob

あなたが現れるif前はどこでも。


より好みで慣れている場合は、何でも使用できます。拡張正規表現=~代わりに演算子を使用してください==

答え2

case ${hostname%"servername0"[123]} in
("$hostname") ! :;; 
(foo|bar) ;;
(*) ! :;; esac

答え3

私はあなたがgrepそれを使用する必要があると思います。たとえば、

HOST_REGEX='(foo|bar)servername(01|02|03)'

if grep -qE "${HOST_REGEX}" <<< "${hostname}"
then
  var="foobarfoo"
fi

一行:

grep -qE '(foo|bar)servername(01|02|03)' <<< "${hostname}" && var="foobarfoo"

答え4

=~テスト演算子を使用できます。これは引用符なしで拡張正規表現を受け入れます(に似ていますegrep)。

if [[ "$hostname" =~ (foo|bar)servername(01|02|03) ]]
then echo matches
else echo no match
fi

関連情報