Correspondendo a palavra dentro de várias strings

0

Abaixo, o código está funcionando bem:

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

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

Quando executo isso, como esperado, recebo a saída yes .

No código acima, o valor das variáveis não são codificadas, elas são provenientes da execução anterior, por isso continuam mudando. Aqui o problema é, às vezes vem como:

var3='partial|fail'

Qualquer valor variável pode mudar assim. Então, neste caso, dá no . O que devo fazer para alterar meu código para lidar com essa situação e corresponder à palavra com falha e mostrar o resultado yes ?

    
por serenesat 13.04.2017 / 16:15

3 respostas

0

Faça o case em str ,

case $var1$var2$var3$var4 in
   *$str*) 
          echo yes 
   ;;
   *) 
          echo no 
   ;;
esac
    
por 13.04.2017 / 17:57
0
       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

Com sua abordagem, teremos que recorrer a eval .

Outro 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
    
por 13.04.2017 / 17:38
0
#!/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";
}}'

Você pode substituir as atribuições de var citadas acima por valores dinâmicos conforme necessário. Se eu entendi o requisito, é que "sim" deve ser enviado sempre que "str" for correspondido a alguma parte de um dos vars?

    
por 13.04.2017 / 20:19