【发布时间】:2017-05-22 05:50:04
【问题描述】:
我想检查该变量的日期格式是否正确或变量是否为空...如果日期格式正确,那么我将执行某事
我试过了:
dada=2015-10-11
if [[ "$dada" = ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
then echo "Date $dada is valid (YYYY-MM-DD)"
else echo "Date $dada is not invalid format (YYYY-MM-DD)"
fi
还有
if [ "`date '+%Y-%m-%d' -d $d 2>/dev/null`" = "$dada" ]
then echo "Date $dada is valid (YYYY-MM-DD)"
else echo "Date $dada is not invalid format (YYYY-MM-DD)"
fi
但它似乎总是会返回并告诉我我的格式不正确。
$dada 是一个动态变量,它可以是数字 '444.1' ,日期格式 '2017-11-12' 或字符串 'hello this is not valid'
【问题讨论】:
-
您希望进行多彻底的检查?例如,支票是否应该拒绝
2015-02-29?经典的方法是case "$dada" in ([12][0189][0-9][0-9]-[01][0-9]-[0-3][0-9]) : OK;; (*) : Not OK;; esac——但可能有更好的现代方法。这主要允许 18xy、19xy、20xy、21xy(尽管它确实允许 10xy、11xy、28xy、29xy)作为年份;你必须决定这是否明智。同样,它允许通过第 13-19 个月和第 32-39 天;那些是无条件无效的。然后你就剩下“9 月还有 30 天……”要担心。 -
2015-02-29 也应该被拒绝是的! @JonathanLeffler
-
如果您需要拒绝
2015-02-29,您将需要比单行更多的检查 - 否则单行将非常长且复杂,并且其中会有很多替代方案。 -
@JonathanLeffler 我明白了,如何检查字符串格式是否像 XXXX-XX-XX 一样到位?我拥有的当前代码返回“无效回声”
-
我展示的
case命令在 1800 到 2199 年的范围内做了合理的工作。但它是“老派”符号。优点是它有效,我不必阅读手册。测试一下——把:命令改成echo。