아래 코드는 정상적으로 작동합니다.
#!/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"가 출력됩니까?