检查字符串是否为日期格式(UNIX)?

时间:2017-05-22 05:50:04

标签: shell unix ksh

我想检查该变量是否采用正确的日期格式或变量是否为空...如果它的格式是正确的,那么我将执行某事

我试过了:

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是一个动态变量wherby它可以是一个数字' 444.1' ,日期格式' 2017-11-12'或者字符串'你好,这是无效的'

2 个答案:

答案 0 :(得分:0)

dada=2015-10-11
date -d $dada > /dev/null 2>&1 
[[ $? -eq 0 ]] && echo ok  ||  echo not ok

答案 1 :(得分:0)

将大量评论转换为答案。

您想要的检查有多彻底?例如,支票是否应拒绝2015-02-29?

  2015-02-29也应该被拒绝了!

如果您需要拒绝2015-02-29,那么您需要的检查要多于单行 - 或者单行将非常长且复杂,并且会有很多替代方案。

验证数据模式的经典方法是使用case语句中的模式匹配 - 可能使用类似这样的内容:

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个月(和00)和第32-39天(以及00);那些无条件无效。然后你就离开" 30 days hath September, …"担心。

如果删除了模式周围的前导(,那么该语句将适用于古老和古老的shell,例如Bourne shell。它与Korn shell无关 - 它是POSIX类shell和POSIX之前的标准符号。

  

如何检查字符串格式是否就像XXXX-XX-XX一样?

我所展示的案件指令多年来在1800到2199年之间做了一项合理的工作。但这是一个老派'符号。优点是它有效,我不必阅读手册。测试它 - 将:命令更改为echo

  

我试过这个案子,但似乎代码没有将我的数据识别为日期。我的dada声明有什么问题吗?

在我的Mac上,我能够运行(逐字 - 单行命令):

ksh -c 'dada=2015-10-11; case "$dada" in ([12][0189][0-9][0-9]-[01][0-9]-[0-3][0-9]) echo OK;; (*) echo Not OK;; esac'

我得到OK作为输出。对于2215-10-112015-20-11等值,我得到了Not OK。使用dada="2015-01-11";代替不带引号的形式会更好,但实际上并不重要。

  

如果我要在日期后面添加时间 - 2015-20-11 23:21怎么样?我可以将其写成' case "$HELLO" in ([0-3][0-9]/[01][0-9]/[0-9][0-9] [0-2][0-9]:[0-6][0-9])'

你当然可以添加一个与时间相匹配的glob表达式。我不明白为什么你提出的那个可能是正确的,但可以使用其他模式。

例如:

dada="2015-11-20 23:21"
case "$dada" in
([12][0189][0-9][0-9]-[01][0-9]-[0-3][0-9]\ [012][0-9]:[0-5][0-9])
    echo OK;;
(*) echo Not OK;;
esac

请注意,在模式中的空格之前需要反斜杠。使用显示的数据运行时,脚本会报告OK。将23更改为32,然后报告Not OK

可能有一种方法可以使用[[命令执行此操作,而不是写出case语句。

使用case进行更复杂(彻底)验证可能不是一个好主意。您可以更好地调用正确验证日期的工具。您可以使用(GNU)date命令,也可以使用Perl或Python或其中一种脚本语言。这些会拒绝2015-02-29 23:21但允许2016-02-29 23:21没有问题。