Linux测试表达式

时间:2016-08-22 14:36:17

标签: shell ksh

我正在开发一个包含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上运行。

2 个答案:

答案 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

这会给你一个想法,但不能解决任何一种格式。当然,它不会捕获无效的月份值,因为它会匹配AAAZZZ; - )。< / p>

让它与所有可能的缩写相匹配是一个我害怕的咨询项目; - )

IHTH

答案 1 :(得分:1)

表达式匹配末尾包含数字的所有内容,或者数字是唯一字符的位置。

在您的情况下,如果语句测试颠倒了逻辑。不以数字和数字结尾不是最后一个字符。