Linux Bash验证日期

Linux Bash验证日期,linux,bash,macos,validation,date,Linux,Bash,Macos,Validation,Date,我正在写一个shell脚本,不明白为什么我的日期验证代码不起作用。我对发现的类似问题尝试了以下解决方案,但is_valid始终设置为1: date "+%m/%d/%Y" -d "$1" 2>1 > /dev/null //or.. date -d "2012-02-29" > /dev/null 2>&1 is_valid=$? #always set to 1, even when given a valid date 如何正确验证日期格式?日期仅在格式为M

我正在写一个shell脚本,不明白为什么我的日期验证代码不起作用。我对发现的类似问题尝试了以下解决方案,但is_valid始终设置为1:

date "+%m/%d/%Y" -d "$1" 2>1 > /dev/null
//or..
date -d "2012-02-29" > /dev/null 2>&1
is_valid=$?
#always set to 1, even when given a valid date
如何正确验证日期格式?日期仅在格式为MM/DD/YYYY时有效


我也尝试过这个解决方案:但它也总是拒绝日期。

我想出了这个小功能:

function isDateInvalid()
{
  date -d "$1" "+%m/%d/%Y" > /dev/null 2>&1
  res=$?
  echo "$res"
}

isDateInvalid "2012-02-219"
1

isDateInvalid "2012-02-29"
0

Mac OS X附带的BSD
date
不支持
-d
选项(或者更确切地说,它使用
-d
实现完全不同的功能)。安装GNU
date
,或使用以下命令验证输入字符串:

date -f "%Y-%m-%d" -j "2012-02-29" >/dev/null 2>&1
-f
提供输入格式,
-j
告诉
date
只输出日期,而不尝试设置系统时钟

for y in {2013..2014}; do
  for m in {01..12}; do
    for d in {01..31}; do
      [[ ! "`date -jf %Y%m%d $y$m$d +%Y%m%d`" = "$y$m$d" ]] && continue
      echo $y.$m.$d
    done
  done
done

如果字符串匹配,循环将继续

我没有经历同样的结果。当我运行
date-d“2012-02-29>/dev/null 2>&1”然后运行“echo$?”时,我得到了
0`。
date--version
为您打印了什么?(顺便说一句,我得到的结果与Mbrach和Aleksey Izmailov的结果相同。)它打印:“日期:非法选项--\n用法:日期…”我使用的是Mac OSX,但你现在发现,Mac OS X不是Linux,GNU扩展不一定在非Linux机器上工作。有时,困难在于确定什么时候是扩展名。顺便说一句,
MM/DD/YYYY
是一种选择得很差的日期格式,它与
DD/MM/YYYY
非常不明确。使用
YYYY-MM-DD
可以正确排序并且符合RFC。这些行之间没有任何内容。我真的是一个回声$?命令之后,它总是打印1