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 case
aufstr,
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?