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
这给了你一个想法,但不能解决任何一种格式,当然,它不会捕获无效的月份值,因为它将匹配 AAA
到 ZZZ
;-) .
让它匹配所有可能的缩写恐怕是一个咨询项目;-)
IHTH
表达式匹配末尾包含数字或数字是唯一字符的所有内容。
在您的例子中,if 语句测试的是相反的逻辑。不以数字结尾且数字不是最后一个字符。
我正在使用 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
这给了你一个想法,但不能解决任何一种格式,当然,它不会捕获无效的月份值,因为它将匹配 AAA
到 ZZZ
;-) .
让它匹配所有可能的缩写恐怕是一个咨询项目;-)
IHTH
表达式匹配末尾包含数字或数字是唯一字符的所有内容。
在您的例子中,if 语句测试的是相反的逻辑。不以数字结尾且数字不是最后一个字符。