Übereinstimmendes Wort in mehreren Zeichenfolgen

Übereinstimmendes Wort in mehreren Zeichenfolgen

Der folgende Code funktioniert einwandfrei:

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

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

Wenn ich dies ausführe, erhalte ich wie erwartet eine Ausgabe yes.

Im obigen Code sind die Werte der Variablen nicht fest codiert, sie stammen aus dem vorherigen Durchlauf und ändern sich daher ständig. Das Problem dabei ist, dass es manchmal so aussieht:

var3='partial|fail'

Jeder Variablenwert kann sich auf diese Weise ändern. In diesem Fall ergibt sich also no. Was muss ich in meinem Code ändern, damit er diese Situation handhaben kann, das fehlerhafte Wort abgleicht und das Ergebnis anzeigt yes?

Antwort1

Machen Sie die caseaufstr,

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

Antwort2

       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

Bei Ihrem Ansatz müssen wir auf zurückgreifen eval.

Eine andere Methode:

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

Antwort3

#!/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";
}}'

Sie können die oben in Anführungszeichen gesetzten Variablenzuweisungen nach Bedarf durch spontane Werte ersetzen. Wenn ich die Anforderung richtig verstanden habe, soll „yes“ ausgegeben werden, wenn „str“ mit einem Teil einer der Variablen übereinstimmt?

verwandte Informationen