Linux 测试表达式

Linux test expression

我正在使用 20 年前的代码进行项目,该代码已被修补数十次。

有一个我以前从未见过的测试表达式,我不知道如何分解它的实际作用。

有一个日期变量,其格式为 'YYYYMMDD' 或 'YYYYMMMDD'(例如“20160629”或“2016JUN29”)。

测试是:

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

谁能解释一下“*[0-9]”表达式的作用? AFAICT 无论 $date var 包含什么,它都不会出现错误退出。根据生成日期的代码,它应该是 'YYYYMMMDD' 格式。

此代码最初 运行 在 Sun Solaris 上,但现在 运行 在 RHEL 6.4 上使用 ksh shell。

我们只能说测试正在检查最后一个字符是否为数字

$ 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

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

在您的例子中,if 语句测试的是相反的逻辑。不以数字结尾且数字不是最后一个字符。