如何强制执行日期格式

时间:2017-01-17 17:08:34

标签: regex shell unix

我想使用date命令从用户输入输出星期几。

我想强制输入格式为MM / DD / YYYY。

例如,在命令行我给出

./programname MM/DD/YYYY MM/DD/YYYY

脚本本身的片段

#!/bin/bash

DATE_FORMAT="^[0-9][0-9][/][0-9][0-9][/][0-9][0-9][0-9][0-9]$" #MM/DD/YYYY
DATE1="$1"
DATE2="$2"

......接着是

if [ "$DATE1" != "$DATE_FORMAT" ] || [ "$DATE2" != "$DATE_FORMAT" ]; then 
    echo -e "Please follow the valid format MM/DD/YYYY.\n" 1>&2
    exit 1

现在,即使输入正确的日期格式,问题仍然存在,

./programname 11/22/2014 11/23/2014

我仍然收到我设置的错误消息,这意味着即使我输入有效格式,if的条件也会被评估为真...有任何建议,为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

这个脚本似乎有效:

#!/bin/bash

DATE_FORMAT="^[01][0-9][/][0-3][0-9][/][0-9][0-9][0-9][0-9]$" #MM/DD/YYYY
DATE1="$1"
DATE2="$2"

if [[ "$DATE1" =~ $DATE_FORMAT ]] && [[ "$DATE2" =~ $DATE_FORMAT ]]
then echo "Both dates ($DATE1 and $DATE2) are OK"
else echo "Please follow the valid format MM/DD/YYYY ($DATE1 or $DATE2 is wrong)."
fi

它使用=~运算符在Bash的[[ test command内进行正向正则表达式匹配。文档没有提到负!~的负匹配(尽管这是Awk和Perl使用的)。使用单括号[测试命令,没有正则表达式匹配。请注意,正则表达式必须用双引号括起来:

  

可以引用模式的任何部分以强制引用的部分作为字符串匹配。必须小心处理正则表达式中的括号表达式,因为正常的引号字符会丢失括号之间的含义。如果模式存储在shell变量中,引用变量扩展会强制整个模式匹配为字符串。

测试也更严格,拒绝23/45/2091,以及其他无效的日期字符串。

$ bash dt19.sh  11/22/2014 11/23/2014
Both dates (11/22/2014 and 11/23/2014) are OK
$ bash dt19.sh  31/22/2014 11/43/2014
Please follow the valid format MM/DD/YYYY (31/22/2014 or 11/43/2014 is wrong).
$

答案 1 :(得分:0)

更正后的代码:

#!/bin/bash
DATE1="$1"
DATE2="$2"
if echo "$DATE1" | grep -q -E '[0-9][0-9][/][0-9][0-9][/][0-9][0-9][0-9][0-9]'
then 
    echo "Do whatever you want here"
    exit 1
else
    echo "Invalid date"
fi