내 bash 스크립트에서 다음 정규식 bash 코드를 사용하여 컴퓨터 이름을 식별합니다 kafka01
.kafka02
kafka03
if [[ $(hostname -s) =~ ^kafka[[:digit:]] ]]
then
/tmp/run.sh
fi
명령 예 hostname
:
hostname -s
kafka01
/tmp/run.sh
그러나 이제 우리는 컴퓨터 이름이 mngkafka01
또는 인 경우 mngkafka02
에도 스크립트를 실행하려고 합니다 mngkafka03
.
그래서 우리는 다음을 수행했습니다. run.sh
머신 이름이 kafka01
or 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