Palabra coincidente dentro de varias cadenas

Palabra coincidente dentro de varias cadenas

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

hazlocasecadena,

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?

información relacionada