Сопоставление слова внутри нескольких строк

Нижеприведенный код работает нормально:

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

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

Когда я выполняю это, как и ожидалось, я получаю вывод yes.

В приведенном выше коде значения переменных не являются жестко закодированными, они приходят из предыдущего выполнения, поэтому они постоянно меняются. Проблема в том, что иногда получается так:

var3='partial|fail'

Значение любой переменной может измениться таким образом. Так что в этом случае он выдает нет. Что я должен изменить в своем коде, чтобы он обработал эту ситуацию и сопоставил неудачное слово и показал результат yes?

0
13.04.2017, 17:15
3 ответа
       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

С вашим подходом нам придется прибегнуть к eval .

Другой метод:

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
0
28.01.2020, 04:47
#!/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";
}}'

При необходимости вы можете заменить указанные выше назначения переменных в кавычках на значения «на лету». Если я понял требование, это то, что "yes" должно выводиться всякий раз, когда "str" ​​сопоставляется с некоторой частью одной из переменных?

0
28.01.2020, 04:47

Займитесь делом на ул,

case $var1$var2$var3$var4 in
   *$str*) 
          echo yes 
   ;;
   *) 
          echo no 
   ;;
esac
0
28.01.2020, 04:47

Теги

Похожие вопросы