매개변수가 문자열과 일치하는지 확인하기 위해 쉘 스크립트를 작성 중입니다. 약 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
의사코드이지만 방향을 안내해야 합니다.