我正在开发一个包含20年代码的项目,该代码已被修补了几十次。
有一个我以前从未见过的测试表达,我无法弄清楚如何分解它实际上在做什么。
有一个日期变量,其格式为'YYYYMMDD'或'YYYYMMMDD'(例如'20160629'或'2016JUN29')。
测试是:
if [[ $datevar != *[0-9] ]]
then
<error notification>
exit 1
fi
有人可以解释'* [0-9]'表达式在做什么吗? AFAICT无论$ date包含什么,它都不会出错。根据生成日期的代码,它应该是'YYYYMMMDD'格式。
此代码最初在Sun Solaris上运行,但现在使用ksh shell在RHEL 6.4上运行。
答案 0 :(得分: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
这会给你一个想法,但不能解决任何一种格式。当然,它不会捕获无效的月份值,因为它会匹配AAA
到ZZZ
; - )。< / p>
让它与所有可能的缩写相匹配是一个我害怕的咨询项目; - )
IHTH
答案 1 :(得分:1)
表达式匹配末尾包含数字的所有内容,或者数字是唯一字符的位置。
在您的情况下,如果语句测试颠倒了逻辑。不以数字和数字结尾不是最后一个字符。