El siguiente código funciona bien:
#!/bin/bash
str='fail'
var1='pass'
var2='ok'
var3='fail'
var4='pass'
case $str in
$var1|$var2|$var3|$var4)
echo yes
;;
*) echo no
;;
esac
Cuando ejecuto esto, como se esperaba, obtengo un resultado yes
.
En el código anterior, el valor de las variables no está codificado, provienen de una ejecución anterior, por lo que sigue cambiando. Aquí el problema es que a veces viene como:
var3='partial|fail'
Cualquier valor de variable puede cambiar así. Entonces en este caso da no
. ¿Qué debo hacer para cambiar en mi código para que maneje esta situación, coincida con la palabra fallida y muestre el resultado yes
?
Respuesta1
hazlocase
cadena,
case $var1$var2$var3$var4 in
*$str*)
echo yes
;;
*)
echo no
;;
esac
Respuesta2
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
Con su planteamiento tendremos que recurrir a eval
.
Otro método:
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
Respuesta3
#!/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";
}}'
Puede reemplazar las asignaciones de var citadas anteriormente con valores sobre la marcha según sea necesario. Si he entendido el requisito, ¿es que se muestre "sí" siempre que "str" coincida con alguna parte de una de las variables?