linux - 有效的 shell 脚本输入日期格式

标签 linux shell

我已经使用了针对以下问题发布的方法,但我仍然遇到一些问题。

Validate date format in a shell script

$ ./check_date.sh 20190109
Input date format 20190109        # this should report error!

$ ./check_date.sh 2019-0109
[ERROR]: Invalid input date format 2019-0109

$ ./check_date.sh 2019-01-09
Input date format 2019-01-09

$ cat ./check_date.sh
#!/usr/bin/bash
date '+%Y-%m-%d' -d $1 > /dev/null 2>&1
if [ "$?" -ne 0 ]; then
    echo "[ERROR]: Invalid input date format $1"
    exit 1
else
    echo "Input date format $1"
fi

如您所见,我预计输入 20190109 会导致脚本报告 ERROR,但它可以正常运行。

总而言之,我需要验证输入的日期字符串,使其严格遵循格式YYYY-MM-DD

问题>我应该怎么做才能让脚本按预期工作?

谢谢

最佳答案

以下测试应该有效:

if [[ "$1" =~ [0-9]{4}(-[0-9]{2}){2} ]] && date -d "$1" >/dev/null 2>&1; then
   success
else
   error
fi

它首先检查格式是否正确 NNNN-NN-NN,然后使用 date 检查日期是否有效。

为什么您的原始代码不起作用:您写道:

date '+%Y-%m-%d' -d $1 > /dev/null 2>&1

您“假设”字符串 '+%Y-%m-%d' 定义了输入格式,但它实际上定义了输出格式。 Date 能够获取各种输入字符串集合并相应地转换它们:

$ date -d "yesterday" '+%F'
$ date -d "2019-01-01 + 10 days" '+%F'
$ date -d "5 fortnight ago" '+%F'
$ date -d "12/13/1099" '+%F'

您不能强制日期假定输入的日期字符串具有给定的格式。

关于linux - 有效的 shell 脚本输入日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54131898/

相关文章:

linux - 将查找结果附加到 txt 文件

c++ - 是否有任何端口可用于向每个进程广播?

linux - 在终端中输入 "bash -v"命令后出现问题

shell - 如何在非交互模式下配置 pam-auth-update?

bash - shell 脚本 : if statement

c - 以原子方式打开和锁定文件

linux - "Pentium4 and above"处理器的 gcc 的最佳 march 和 mtune 选项是什么

linux - 无法安装 Homebrew 软件

linux - 使用shell脚本一个接一个地卸载软件

c - 从 Linux shell 向 C 代码提供输入参数