2016-08-22 29 views
0

我正在使用已修補數十次的20年舊代碼的項目。Linux測試表達式

有一個我從未見過的測試表達式,我無法弄清楚如何分解它實際上在做什麼。

有一個日期變量,其格式爲'YYYYMMDD'或'YYYYMMMDD'(例如'20160629'或'2016JUN29')。

測試是:

if [[ $datevar != *[0-9] ]] 
then 
<error notification> 
exit 1 
fi 

有人能解釋一下什麼是 '* [0-9]' 的表達是幹什麼的? AFAICT無論$ date var包含什麼,它都不會接受錯誤退出。根據生成日期的代碼,它應該是'YYYYMMMDD'格式。

此代碼最初在Sun Solaris上運行,但現在使用ksh shell在RHEL 6.4上運行。

+3

看起來像一個非常自由的驗證我?如果$ datevar包含任何(*)後跟一個[0-9]的數字,那麼可能爲什麼一切都會通過 – sloven

+0

您能否接受答案? – agilob

回答

1

我們所能說的是,測試是檢查的最後一個字符是數字

$ datevar=20160629 
$ if [[ $datevar != *[0-9] ]] ; then 
    echo caught error 
    fi 
# no output from above 

$ datevar=20160629X 
$ if [[ $datevar != *[0-9] ]] ; then 
    echo caught error 
    fi 
caught error 
$ 

就個人而言,我更喜歡使用這種驗證case聲明。

case $datevar in 
    2[0-9][0-9][0-9][A-Z][A-Z][A-Z][0-3][0-9]) : nothing_to_do_correct_format ;; 
    *) echo error in format for $datevar ;; 
esac 

這給你一個想法,但不解決,當然這兩種格式並且,它不捕獲無效月值,因爲它會匹配AAAZZZ ;-)。

使與之相匹配的所有可能的縮寫是一個諮詢項目恐怕;-)

IHTH

1

的表達式匹配包含一個數字結尾,或者一個數字是唯一的字符一切。

就你而言,如果語句測試顛倒了邏輯。不以數字結尾,數字不是最後一個字符。