2016-08-22 52 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

的表达式匹配包含一个数字结尾,或者一个数字是唯一的字符一切。

就你而言,如果语句测试颠倒了逻辑。不以数字结尾,数字不是最后一个字符。