두 개의 다른 호스트 이름과 일치하는 bash + 정규 표현식

두 개의 다른 호스트 이름과 일치하는 bash + 정규 표현식

내 bash 스크립트에서 다음 정규식 bash 코드를 사용하여 컴퓨터 이름을 식별합니다 kafka01.kafka02kafka03

if [[ $(hostname -s) =~ ^kafka[[:digit:]] ]]
then
/tmp/run.sh
fi

명령 예 hostname:

hostname -s
kafka01

/tmp/run.sh그러나 이제 우리는 컴퓨터 이름이 mngkafka01또는 인 경우 mngkafka02에도 스크립트를 실행하려고 합니다 mngkafka03.

그래서 우리는 다음을 수행했습니다. run.sh머신 이름이 kafka01or etc 인 경우 스크립트를 실행해야 합니다 mngkafka01.

if [[ $(hostname -s) =~ ^[mng]kafka[[:digit:]] ]]
then
/tmp/run.sh
fi

하지만 이 일반 구문은 작동하지 않습니다.

내 정규식 코드에 어떤 문제가 있나요?

답변1

콰지모도이미 당신에게 주어진정규식이 실패하는 이유에 대한 답변입니다. 나는 다른 접근법을 제안하고 싶습니다. case정규식 대신 glob을 사용하세요 .

case $(hostname -s) in
  kafka[0-9]*|mngkafka[0-9]*)
    /tmp/run.sh
esac

이는 더 많은 모드로 확장하기가 더 쉽고, 개인적으로 읽기에도 더 쉽습니다.

답변2

[mng]일치하지 않습니다. mng또는 m또는 와 일치합니다 n. g적합한 정규 표현식은 (^|^mng)kafka[[:digit:]]+$다음과 같습니다. 이는 다음과 일치합니다.

  • (^|^mng)빈 문자열 또는 mng문자열의 시작,
  • kafka,
  • [[:digit:]]+$문자열 끝에 고정된 하나 이상의 숫자입니다.

이전 정규 표현식도 kafka7u 고정되어 있지 않기 때문에 거짓 긍정을 발생시킵니다.

시험:

arr=(kafka01 kafka7u mngkafka01 gkafka7x)
for i in "${arr[@]}"; do
    if [[ $i =~ (^|^mng)kafka[[:digit:]]+$ ]]; then
        echo "$i"
    fi
done

산출:

kafka01
mngkafka01

추가 정보:조건부 구조( [[...]]장 참조).

처음 시도한 것의 수정된 버전:

if [[ $(hostname -s) =~ (^|^mng)kafka[[:digit:]]+$ ]]
then
    /tmp/run.sh
fi

관련 정보