2017-03-31 58 views
1

我需要bash檢查CI_COMMIT_REF_NAME是否匹配字符串master或三部分版本號如1.3.5,1.1.11等。Bash:使用正則表達式檢查字符串是否看起來像三部分版本號

這裏是我的嘗試:

#!/bin/bash 
CI_COMMIT_REF_NAME=1.1.4 
if [ $CI_COMMIT_REF_NAME == 'master' ] || [[ $CI_COMMIT_REF_NAME =~ ^([0-9]{1,2}\.){2}[0-9]{1,2}$ ]] 
then 
    echo "true" 
else 
    echo "false" 
fi 

預期的輸出是true,但我得到false。設置變量爲master按預期工作,所以錯誤必須是我的正則表達式。

我在做什麼錯?

回答

1

您需要聲明的正則表達式爲單引號內一個獨立的變量,不會有問題的解析在bash你的正則表達式,然後並確保括號放在圍繞[0-9]{1,2}\.部分:

rx='^([0-9]{1,2}\.){2}[0-9]{1,2}$' 
if [ $CI_COMMIT_REF_NAME == 'master' ] || [[ $CI_COMMIT_REF_NAME =~ $rx ]] 

online Bash demo

現在,模式匹配:

  • ^ - 串
  • 開始
  • ([0-9]{1,2}\.){2} - 2次出現的1或2位數字用文字點
  • [0-9]{1,2} - 1個或2位數字
  • $ - 字符串的結尾。
+1

我增加了模式描述。是的,括號應該只包含您需要量化的模式。 –

+0

感謝您的幫助! –

1

你可能不希望在行的開頭兩次匹配:

$ CI_COMMIT_REF_NAME=1.1.4 
$ [[ $CI_COMMIT_REF_NAME =~ (^[0-9]{1,2}\.){2}[0-9]{1,2}$ ]] && echo match 
$ [[ $CI_COMMIT_REF_NAME =~ ^([0-9]{1,2}\.){2}[0-9]{1,2}$ ]] && echo match 
match 
+0

所以實際上有兩個錯誤。謝謝! –