Bash shell:如何检查特定的日期格式?

时间:2013-05-13 20:50:45

标签: regex bash sh

我有一个Bash shell脚本,它检查shell变量是否包含数字:

   if ! [[ "$step" =~ ^[0-9]+$ ]]
   then
     exec >&2; echo "error: $step is Not a step number.";
     exit 1
   fi

现在我需要进行类似的检查,以查看变量是否包含所需格式的日期YYYY-MM-DD (例如:今天是2013-05-13)破折号。如何在Bash shell中使用正则表达式完成此操作,还是需要外部程序来执行此操作?

1 个答案:

答案 0 :(得分:12)

正则表达式不适合做这项工作。

e.g。

2013-02-29 (invalid date)
2012-02-29 (valid date)
2013-10-31 (valid date)
2013-09-31 (invalid date)
...

我建议将字符串传递给date -d,然后检查返回值。如果返回0,一切都很好。如果返回1,无效日期。

例如:

kent$  date -d "2012-02-29" > /dev/null 2>&1
kent$  echo $?
0

kent$  date -d "2013-02-29" > /dev/null 2>&1
kent$  echo $?
1

如果您想强制格式为yyyy-mm-dd,则可以正则表达式和date验证。正则表达式仅适用于日期验证的格式和日期。

因为date -d也接受02/27/2012之类的字符串。