我有一个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中使用正则表达式完成此操作,还是需要外部程序来执行此操作?
答案 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
之类的字符串。