다중 또는 문으로 조건을 단순화하는 방법은 무엇입니까?

다중 또는 문으로 조건을 단순화하는 방법은 무엇입니까?

매개변수가 문자열과 일치하는지 확인하기 위해 쉘 스크립트를 작성 중입니다. 약 20개 정도가 있으며 앞으로 더 추가될 필요가 있을 수 있습니다.

현재 제가 쓰는 방식은 읽기 어렵고 업데이트하기가 번거롭습니다. 저는 쉘 스크립팅에 익숙하지 않기 때문에 이를 단순화하고 관리하기 쉽게 만드는 최선의 방법을 잘 모르겠습니다.

if [ $4 =="CRITICAL" ] && [[ $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || ]]
  VARIABLE=1
fi

위 스크립트에서 Foo와 bar는 모두 다른 문자열입니다.

답변1

표준 셸에서는 case대체를 지원하는 를 사용할 수 있습니다.

#!/bin/sh
if [ "$4" = CRITICAL ]; then
        case $2 in
        foo|bar|doo|quux)
                VARIABLE=1
                ;;
        esac
fi

위의 다섯 줄이 case너무 길면 한 줄에 쓰세요.

 case $2 in foo|bar|doo|quux) VARIABLE=1;; esac

이는 ==Bash의 표준은 아니지만 [ .. ]Bash 및 ksh에서는 지원됩니다.

답변2

if [[ $4 == CRITICAL && $2 =~ ^(a|b|c|d|e|f|g)$ ]]; then
  VARIABLE=1
fi

그런데 따옴표가 없는 변수와 위치 매개변수는 내부적으로 사용해도 안전 [[ ... ]]하지만, [ ... ][ $4 == "CRITICAL" ]에서는 [ "$4" == "CRITICAL" ].

또한 CRITICAL위에서는 인용이 전혀 필요하지 않습니다. 공백이나 쉘 메타 문자가 없는 고정 문자열입니다. 어떤 이유로든 실제로 따옴표가 필요한 고정 문자열이라면 작은 따옴표를 사용하는 것이 좋습니다.

작은따옴표는 문자열을 수정하는 데 사용되고, 큰따옴표는 문자열에 변수, 명령 대체 등을 삽입할 때 사용됩니다.

답변3

case어쩌면 함수와 결합된 명령문을 사용할 수도 있을까요 ?

function a_func){ ... }
function b_func(){ ... }

case "${1}" in
  "${4}" == "CRITICAL" && $(echo "${2}" | egrep -n 'a|b|c|d|e|f|g') -gt 0))
    a_func ;;
  *)
    b_func ;;
esac

의사코드이지만 방향을 안내해야 합니다.

관련 정보