この質問への回答が以前にあった場合はお詫び申し上げます。しかし、オンラインで多くの情報が見つかりません。
これが私が達成したいものです:
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
前はどこでも。
より好みで慣れている場合は、何でも使用できます。拡張正規表現=~
代わりに演算子を使用してください==
。