我有这种格式的日期:date -d $datum +"%Y-%m-%d"
在 Linux 上它工作正常,但在 FreeBSD 中这样说:
ERROR wrong format
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
对此有何回应:
date -d $datum +"%Y-%m-%d" >/dev/null 2>&1 || echo "ERROR wrong format"
但它打印出一个错误,然后继续执行代码,看起来是正确的。我应该做什么,这样它就不会打印出错误,如果有错误,程序就会退出?
答案1
我没有可供测试的 bsd 盒子,但看来您需要使用以下形式:
date -f "some format" "$datum" "+%Y-%m-%d"
并且您必须指定传入数据的格式,以便可以对其进行解析。
答案2
您在 Linux 上习惯使用的GNU 版本比大多数其他 Unix 变体上date
的版本支持更多的日期格式。date
它还具有许多其他 Unix 变体上没有的选项。唯一的标准的用法date
是根据参数指定的格式显示当前日期+…
(也是系统管理员设置系统日期的一种方式),以及-u
指定 UTC 而不是本地时区的选项。
在自由BSD,您可以使用该date
实用程序通过选项在日期格式之间进行转换-f
,例如,date -f %s "$datum" +%Y-%m-%d
将以秒表示的日期从纪元转换为人类可读的格式。
如果您想要奇特的日期解析,您可以安装该coreutils
软件包,其中包含 GNU 日期。或者您可以使用Date::Parse
Perl 中的模块或dateutil
在Python中。
要使 shell 脚本在大多数错误时停止,请添加set -e
就在该#!
线下方。
如果您想明确显示错误,则需要您以错误状态退出脚本。将错误打印到 stderr,而不是打印到 stdout。
date -d "$datum" +"%Y-%m-%d" >/dev/null 2>&1 || {
echo "ERROR wrong format" >&2
exit 1
}
或者
if ! date -d "$datum" +"%Y-%m-%d" >/dev/null 2>&1; then
echo "ERROR wrong format" >&2
exit 1
fi