在shell脚本中验证日期格式

Jai*_*chi 12 unix bash shell if-statement date

我必须创建一个Shell脚本,其中一个参数将是dd/mm/yyyy格式的日期.我的问题是,如何检查作为参数传递的日期是否真的遵循此日期格式?我尝试使用grep命令如下:

if echo "$1" | grep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]\{4\}$'
Run Code Online (Sandbox Code Playgroud)

但它没有给出正确的格式,因为例如日期可以是33,34,(...),这不是真正正确的格式.任何人都知道可以真正检查过去的日期是否真的遵循格式dd/mm/yyyy?

P̲̳*_*͓L̳ 22

使用日期

date "+%d/%m/%Y" -d "09/99/2013" > /dev/null  2>&1
 is_valid=$?
Run Code Online (Sandbox Code Playgroud)

如果没有得到0则日期格式无效.

  • WTF?问题是"我如何检查作为参数传递的日期是否真的遵循此日期格式".这不会检查任何事情.``date``接受不同格式的日期.例如``tomorrow``是一种有效的格式,``date -d'明天+ 5个月20:00:01``也是有效的. (7认同)
  • 正如Aleks-Daniel Jakimenko-A。所指出的,这实际上并不检查日期格式。要验证dd是否为YYYY-MM-DD格式并且是有效日期,可以执行以下操作:[[$(date“ +%Y-%m-%d” -d“ $ dd”)==“ $ dd “]] || 回显“无效的日期格式” (3认同)

Vic*_*yew 16

最简单的解决方案仍然可以完美运行,如下所示:

if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1" >/dev/null 2>&1
   ...
Run Code Online (Sandbox Code Playgroud)

它包括两个检查组合:

  • 第一部分检查$1这种格式:NNNN-NN-NN
  • 第二部分检查它是否是有效日期

您需要两个检查,因为:

  • 如果您不进行第一次检查,date即使您的变量是另一种格式的有效日期,也会以代码0退出
  • 如果你不进行第二次检查,那么你甚至可以得到一个0甚至是变量,如 2016-13-45


aug*_*rar 5

首先,使用正则表达式检查输入的形式。然后使用awk切换到mm/dd/yyyy并使用date来验证。您可以在声明中使用以下表达式if:

echo "$1" | egrep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$' && date -d "$(echo "$1" | awk 'BEGIN{FS=OFS="/"}{print $2"/"$1"/"$3}')" >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)


小智 5

此函数需要 2 个字符串,一个格式字符串,一个日期字符串

格式字符串使用 date 命令中的代码,但不包括“+”

如果提供的日期与给定的格式匹配,则该函数返回 0,否则返回 1

代码 (my_script.sh)

#!/bin/bash

datecheck() {
    local format="$1" d="$2"
    [[ "$(date "+$format" -d "$d" 2>/dev/null)" == "$d" ]]
}

date_test="$1"

echo $date_test
if datecheck "%d %b %Y" "$date_test"; then
    echo OK
else
    echo KO
fi
Run Code Online (Sandbox Code Playgroud)

输出

$ ./my_script.sh "05 Apr 2020"
05 Apr 2020
OK
$ ./my_script.sh "foo bar"
foo bar
KO
Run Code Online (Sandbox Code Playgroud)