2013-08-04 104 views
0

任何想法我在這個條件正則表達式中做了什麼錯誤?Bash條件正則表達式

MIN="30" 

if ! [[ "$MIN" =~ [0-5]?[0-9]|\* ]]; then 
    echo "INVALID MINUTE" 
else 
    echo "VALID MINUTE" 
fi 

感謝

* UPDATE *

你沒有包含通配符匹配。我需要做的,因爲我有需要得到滿足,以及諸如小時,一個月(更復雜的)等條件下,這種採用純正則表達式,和星期,像這樣:

[1-2]?[0-9]|\* - This is for hour 
[1-3]?[0-9]|\* - This is for day of month 
1?[0-9]|\*  - This is for month of year 
[0-7]|\*  - This is for day of week (0 = sunday etc) 

即分鐘必須是數字第一和第二位的持有人或可以通配符匹配每一分鐘0 - 59

事實上,現在我看着它,這個解決方案將不會在每月的一天工作,因爲有人可以輸入39這是不是有效的本月的一天。

* UPDATE *

嗯,我並沒有完全按照你的邏輯在第一,但我認爲我對你的東西。這可能會起作用,並且會更簡單。我喜歡複雜的東西...

if ! [[ "$MIN" -gt 0 && "$MIN" -lt 59 || "$MIN" == "\*" ]]; then 

我只是現在有麻煩了,它字面上評估(以及比較)的通配符。

這裏有任何想法。同時在Google上搜索。

* UPDATE *

if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then 

只要再次測試,並檢查了我的語法。當MIN介於0和59之間時,它的效果很好(真),當MIN超過59時它也可以工作(報告爲false),但是隻要您嘗試將MIN設置爲一個* IF語句就會怪異並彈出:

line 340: [: *: integer expression expected 
+0

點評:你不應該使用通配符比較(如果你爲這個發明一種方式),因爲它總是「真實的」。用@Mehul Rathod來代替。 –

+0

不記得我是如何解決這個問題的,因爲它是在一段時間之前,但我並不打算將通配符作爲運算符進行比較,而只是作爲表示通配符的配置文件中的字符。你可能是對的。我沒有考慮過這種解釋。衛生署!我只是在尋找一個包含星號的單個字符串(如果這有助於清除事情。) – Atomiklan

+0

對不起,我不明白這一點!這個評論太大了,我添加了答案。 –

回答

1

我認爲你是雙重否定你的狀況,你有沒有考慮過使用數字操作符?

min="30" 

if ! [[ "$min" -gt 0 && "$min" -lt 59 ]]; then 
    echo "INVALID MINUTE" 
else 
    echo "VALID MINUTE" 
fi 
+0

也在你的腳本中使用小寫變量,以避免與系統變量衝突 –

+0

哦,哇,船已經航行了哈哈。 2000行以後的代碼,並且自從第一天起我就一直在使用所有變量大寫。 – Atomiklan

0

你的問題是(如在UPD解釋)你一直沒能夠比較變量都與串並與一個條件字符串整數。

我建議你先,然後eval比較VS字符串(*符號),並比較整數上更新

MIN="*"; #try also other MIN values 

k=0; # flag. 1 - if valid, 0 - if invalid 

if [ "$MIN" == "*" ]; then 
    k=1; 
else 
    eval "MIN=$MIN"; 
    if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ]; then 
     k=1; 
    fi; 
fi; 

if [ $k -eq 0 ] 
    echo "INVALID MINUTE" 
else 
    echo "VALID MINUTE" 
fi