1

我有一个 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 中的正则表达式来完成此操作,或者我是否需要外部程序来执行此操作?

4

1 回答 1

12

正则表达式不是完成这项工作的正确工具。

例如

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

于 2013-05-13T20:56:56.163 回答