Следующий код работает нормально:
#!/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'
Любое значение переменной может измениться таким образом. Так что в этом случае это дает no
. Что мне следует изменить в моем коде, чтобы он обрабатывал эту ситуацию, сопоставлял слово fail и показывал результат yes
?
решение1
Сделай case
наул,
case $var1$var2$var3$var4 in
*$str*)
echo yes
;;
*)
echo no
;;
esac
решение2
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
решение3
#!/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";
}}'
Вы можете заменить цитируемые назначения var выше на значения «на лету» по мере необходимости. Если я правильно понял требование, оно заключается в том, чтобы «yes» выводилось всякий раз, когда «str» сопоставляется с какой-либо частью одной из var?