여러 문자열 내의 단어 일치

여러 문자열 내의 단어 일치

아래 코드는 정상적으로 작동합니다.

#!/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

을 수행casestr,

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"가 출력된다는 것입니까?

관련 정보