Bash 변수에서 관련된 일련의 값을 테스트하세요.

Bash 변수에서 관련된 일련의 값을 테스트하세요.

이 질문에 대한 답변이 이전에 있었다면 사과드립니다. 하지만 온라인에서 많은 정보를 찾을 수 없습니다.

이것이 내가 달성하고 싶은 것입니다:

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

관련 정보