2014-01-14 75 views
86

我的腳本收到的其中一個參數是以下格式的日期:yyyymmdd檢查字符串是否與Bash腳本中的正則表達式匹配

我想檢查一下,如果我得到一個有效的日期作爲輸入。

我該怎麼做?我想使用像一個正則表達式:[0-9]\{\8}

+0

檢查格式是否正確容易。但我不認爲你可以在bash(帶內置插件)中檢查日期是否有效。 – RedX

回答

147

你可以說:

[[ $date =~ ^[0-9]{8}$ ]] && echo "yes" 

或者更準確:

[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes" 
#   |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ | 
#   | |  ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ | 
#   | |   |     |    | 
#   | |   \     |    | 
#   | --year-- --month--   --day--   | 
#   |   either 01...09  either 01..09  end of line 
# start of line   or 10,11,12   or 10..29 
#            or 30, 31 

也就是說,你可以在慶典匹配定義一個正則表達式的你想要的格式。這樣,你可以這樣做:

[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match" 

注意這是基於由阿萊克斯 - 丹尼爾Jakimenko在User input date format verification in bash解決方案。


在外殼,例如shfish - 更少配備然後bash - 你可以使用grep

(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match" 
+4

Downvote。在''bash''中使用''grep''來表示正則表達式是愚蠢的。 [''在這裏看到我的類似答案'](http://stackoverflow.com/a/18748968/2698019)的正確方法。你也需要引用變量。 –

+0

Uhms,忘了報價,只是更新。關於grep愚蠢,好吧,從其他考慮,對我來說,它更清晰'echo「$ string」| grep -E「^ [0-9] {8} $」'than'$ date =〜^ [0-9] {4} - [0-3] [0-9] - [0-1] [0 -9] $'。 – fedorqui

+0

當bash可以自己完成時,它會調用一個外部工具。如果您在循環中執行此操作,將會導致相當顯着的性能下降。此外,這裏不需要測試命令,「echo」$ st「| grep -Eq'^ [0-9] {8} $'&& echo'yes''' would better better –

23

在bash版本3可以使用 '=〜' 操作符:

if [[ "$date" =~ "[0-9]\{8\}" ]]; then 
    echo "Valid date" 
else 
    echo "Invalid date" 
fi 

參考:http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

注:在匹配運營商的雙括號內引用,[[]],不再需要爲猛砸3.2版

+6

你不應該在正則表達式中使用char「因爲當我使用expresion不起作用 –

17

來測試一個字符串是否是一個正確的日期是一個好辦法使用命令日期:

if date -d "${DATE}" >/dev/null 2>&1 
then 
    # do what you need to do with your date 
else 
    echo "${DATE} incorrect date" >&2 
    exit 1 
fi 
+3

高度評價你的答案,因爲它讓日期函數處理日期而不是易錯誤的正則表達式' – Ali

+0

這對於檢查在廣泛的日期選項,但如果你需要驗證一個特定的日期格式,它可以這樣做嗎?例如,如果我'日期-d 2017-11-14e'它返回星期二11月14日05:00:00 UTC 2017,但那會破壞我的劇本。 – flickerfly

相關問題