아래 코드는 정상적으로 작동합니다.
#!/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
str,
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"이 var 중 하나의 일부와 일치할 때마다 "yes"가 출력된다는 것입니까?