下面的程式碼工作正常:
#!/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
.我應該在程式碼中進行哪些更改才能處理這種情況並匹配失敗單字並顯示結果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 賦值替換為即時值。如果我理解了要求,那麼每當「str」與其中一個變數的某些部分相符時,就會輸出「yes」?