이 질문에 대한 답변이 이전에 있었다면 사과드립니다. 하지만 온라인에서 많은 정보를 찾을 수 없습니다.
이것이 내가 달성하고 싶은 것입니다:
if [[ "${hostname}" = (foo | bar)servername(01 | 02 | 03) ]]; then
var="foobarfoo"
fi
따라서 fooservername01, barservername02, fooservername03, barservername03 등은 조건을 충족합니다.
나는 훨씬 덜 효율적인 방법으로 이 작업을 수행했습니다.
if [[ ${hostname} == "fooservername01" ]] || [[ ${hostname} == "fooservername02" ]] || [[ ${hostname} == "fooservername03" ]] || [[ ${hostname} == "barservername01" ]] || [[ ${hostname} == "barservername02" ]] || [[ ${hostname} == "barservername03" ]]; then
var="foobarfoo"
fi
하지만 코드를 최적화/단순화하고 싶습니다.
나는 아직 bash 스크립팅이나 심지어 일반적인 스크립팅에 대해 매우 익숙하지 않기 때문에 어떤 통찰력이라도 크게 감사하겠습니다.
답변1
당신이 쓴 것과 거의 똑같이 할 수 있습니다. 당신이 사용할 때[[
그 다음에==
사용패턴 매칭오른쪽에 있습니다. Bash 모드에서는 다음을 사용하여 패턴 세트 중 하나를 일치시킬 수 있습니다 @(a|b|c)
.
if [[ "${hostname}" = @(foo|bar)servername@(01|02|03) ]]; then
이는 귀하가 식별한 모든 사례와 일치합니다. @( ... | ... )
다음과 같은 |
분리된 패턴과 일치합니다. 너또한 할 수 있다다른 글로브 *
및 ?
추가 [character classes]
복합 패턴을 사용하여 반복, 선택 또는 음수 패턴을 구현하십시오.
이러한 확장 모드를 사용하려면 extglob
셸 옵션을 활성화해야 합니다. 아직 활성화되지 않은 경우(구문 오류가 발생함) 다음을 통해 활성화할 수 있습니다.
shopt -s extglob
당신이 나타나기 if
전에는 어디든지요 .
더 선호하고 익숙하다면 아무거나 사용해도 됩니다.확장 정규식=~
대신 연산자를 사용합니다 ==
.
답변2
case ${hostname%"servername0"[123]} in
("$hostname") ! :;;
(foo|bar) ;;
(*) ! :;; esac
답변3
나는 당신이 grep
그것을 사용해야한다고 생각합니다. 예를 들어:
HOST_REGEX='(foo|bar)servername(01|02|03)'
if grep -qE "${HOST_REGEX}" <<< "${hostname}"
then
var="foobarfoo"
fi
한 줄:
grep -qE '(foo|bar)servername(01|02|03)' <<< "${hostname}" && var="foobarfoo"
답변4
=~
테스트 연산자를 사용할 수 있습니다 . 이는 따옴표가 없는 확장 정규 표현식을 허용합니다( 와 유사 egrep
).
if [[ "$hostname" =~ (foo|bar)servername(01|02|03) ]]
then echo matches
else echo no match
fi