複数の文字列内の単語の一致

複数の文字列内の単語の一致

以下のコードは正常に動作します:

#!/bin/bash
str='fail'
var1='pass'
var2='ok'
var3='fail'
var4='pass'

case $str in
   $var1|$var2|$var3|$var4)
   echo yes
   ;;
   *) echo no
   ;;
esac

これを実行すると、予想どおり出力が得られますyes

上記のコードでは、変数の値はハードコードされておらず、前回の実行から取得されるため、変化し続けます。ここで問題となるのは、次のような場合です。

var3='partial|fail'

どの変数値もこのように変更される可能性があります。したがって、この場合は となりますno。この状況を処理して失敗した単語を一致させ、結果を表示するには、コードをどのように変更すればよいでしょうかyes?

答え1

caseオンにするstr

case $var1$var2$var3$var4 in
   *$str*) 
          echo yes 
   ;;
   *) 
          echo no 
   ;;
esac

答え2

       case $var1 in *"$str"* ) echo yes ;;
   * ) case $var2 in *"$str"* ) echo yes ;;
   * ) case $var3 in *"$str"* ) echo yes ;;
   * ) case $var4 in *"$str"* ) echo yes ;;
   * ) echo no ;; esac;; esac;; esac;; esac

あなたのアプローチでは、私たちは に頼らざるを得ないでしょうeval

別の方法:

unset -v f
A=( "$var1" "$var2" "$var3" "$var4" )
for var in "${A[@]}"; do case $var in *"$str"* ) f=; echo yes; break;; esac; done
${f+:} echo no

答え3

#!/bin/bash
str="fail";
echo ${str} |awk -v var1="pass" \
-v var2="ok" \
-v var3="partial|fail" \
-v var4="pass" \
'{ if (( $0 ~ var1 ) || ( $0 ~ var2 ) || ( $0 ~ var3 ) || ( $0 ~ var4 )) {
  print "yes";
} else {
  print "no";
}}'

必要に応じて、上記の引用符で囲まれた変数の割り当てをオンザフライの値に置き換えることができます。要件を理解していれば、"str" がいずれかの変数の一部と一致するたびに "yes" が出力されるということですか?

関連情報