Linux

bash + 匹配兩個不同主機名的正則表達式

  • December 24, 2020

在我的 bash 腳本中,我標識了機器名稱 -kafka01或使用kafka02以下kafka03 正則表達式 bash 程式碼

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

命令範例hostname

hostname -s
kafka01

但是現在我們要執行腳本 -/tmp/run.sh如果機器名稱是mngkafka01ormngkafka02mngkafka03.

所以我們做了以下事情;run.sh如果機器名稱是kafka01or等​​,這應該執行腳本mngkafka01

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

但是這種正常語法不起作用。

我的正則表達式程式碼有什麼問題?

[mng]不匹配mng,它匹配morng。一個合適的正則表達式是(^|^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

這更容易擴展到更多模式,而且我個人覺得它更容易閱讀。

引用自:https://unix.stackexchange.com/questions/617666