2011-08-11 250 views
1

我一直在寫一點bash腳本來幫助經驗較少的Linux用戶使用一些命令。有一件事似乎在逃避我,並且在爲if語句做模式匹配時使用大括號。Bash shell if語句與花括號匹配正則表達式{}

regex="[A-Za-z0-9]/{5/}" 
if [[ $2 =~ $regex ]] 
then 
    num=$2 
else 
    echo "Invalid entry" 
    exit 1 
fi 

這應該捕獲任何A-Z,a-z或0-9,如果不是5個字符,它應該是正確的?

我試過很多次,許多變化,許多報價,有和沒有逃脫......似乎沒有什麼是工作:

+ regex='[A-Fa-f0-9]/{5/}' 
+ [[ abcd1 =~ [A-Za-z0-9]/{5/} ]] 
+ echo 'Invalid entry' 

任何想法我失蹤?

GNU bash, version 3.2.39(1)-release 

回答

1

你應該嘗試

regex="[A-Za-z0-9]{5}" 

編輯:另一個變化,你可以嘗試是

if [[ "$2" =~ $regex ]] 

EDIT2:如果你只是想確定是否$2爲5個字符長,你可以嘗試像

if [ ${#2} = 5] 
+0

我有。我嘗試了幾十種變化。有和沒有正則表達式在變量中: regex =「[A-Fa-f0-9] \ {5 \}」 regex =「[A-Fa-f0-9] \ {5}」 正則表達式=「[A-Fa-f0-9] {5}」 [[$ 2 =〜[A-Fa-f0-9] \ {5 \}]] 與上面相同的正則表達式+似乎沒有任何工作。任何其他方式來檢查$ 2是5個字符? – Colin

1

嗯,對我的作品在bash版 「GNU的bash,版本4.1.10(4)-release」

$ regexp="[[:alnum:]]{5}" 
$ set -- "" abcde 
$ [[ "$2" =~ $regexp ]] && echo y || echo n 
y 
$ set -- "" foo 
$ [[ "$2" =~ $regexp ]] && echo y || echo n 
n 

注意,右邊不得被引用:

$ set -- "" abcde 
$ [[ "$2" =~ "$regexp" ]] && echo y || echo n 
n 

你實際上並不需要爲這個正則表達式:

$ glob="[[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]" 
$ set -- "" abcde 
$ [[ "$2" == $glob ]] && echo y || echo n 
y 
$ set -- "" foo 
$ [[ "$2" == $glob ]] && echo y || echo n 
n 
2

也許問題就在這裏:

regex="[A-Za-z0-9]/{5/}" 

應該是:

regex="[A-Za-z0-9]\{5\}" 

(手錶反斜槓)

+0

謝謝,當我使用雙引號時,我不知道我必須逃脫 –