我想检查该变量是否采用正确的日期格式或变量是否为空...如果它的格式是正确的,那么我将执行某事
我试过了:
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'或者字符串'你好,这是无效的'
答案 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-11
和2015-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
没有问题。