Linux
bash + 匹配兩個不同主機名的正則表達式
在我的 bash 腳本中,我標識了機器名稱 -
kafka01
或使用kafka02
以下kafka03
正則表達式 bash 程式碼if [[ $(hostname -s) =~ ^kafka[[:digit:]] ]] then /tmp/run.sh fi
命令範例
hostname
:hostname -s kafka01
但是現在我們要執行腳本 -
/tmp/run.sh
如果機器名稱是mngkafka01
ormngkafka02
或mngkafka03
.所以我們做了以下事情;
run.sh
如果機器名稱是kafka01
or等,這應該執行腳本mngkafka01
:if [[ $(hostname -s) =~ ^[mng]kafka[[:digit:]] ]] then /tmp/run.sh fi
但是這種正常語法不起作用。
我的正則表達式程式碼有什麼問題?
[mng]
不匹配mng
,它匹配m
orn
或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
Quasimodo已經為您提供了正則表達式失敗的原因的答案。我會建議一種不同的方法。代替正則表達式,使用
case
和 glob:case $(hostname -s) in kafka[0-9]*|mngkafka[0-9]*) /tmp/run.sh esac
這更容易擴展到更多模式,而且我個人覺得它更容易閱讀。