日期“1 个月前”在 AIX 中不起作用

had*_*des 2 aix shell-script

在机器 A(运行 Oracle Linux Server 6.4 版)中,我可以使用以下命令智能地获取 1 个月前的日期:

$(date -d"1 month ago" '+%Y0%m')
Run Code Online (Sandbox Code Playgroud)

但它在机器 B(AIX) 中不起作用,有没有其他方法可以实现这一点?两者都在.sh文件中并运行:

sh Test.sh
Run Code Online (Sandbox Code Playgroud)

机器 B 中显示的错误:

date: illegal option -- d
Usage: date [-u] [+Field Descriptors]
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 13

它与shell无关,而与date命令有关。该-d选项特定于date命令的 GNU 实现。在非 GNU 系统上,除非您将 GNU 版本安装date为单独的包(可能会安装为gdate或安装为/opt/gnu/bin/date...),否则这将不起作用。

请注意,最近版本的 ksh93 具有与其printf内置命令类似的功能:

printf '%(%Y%m)T\n' '1 month ago'
Run Code Online (Sandbox Code Playgroud)

(另请参阅zsh另一个具有内置日期操作支持的strftimeshell(zsh/datetime模块中内置))。

其他一些date实现也具有调整日期的功能。例如,使用 BSD date,您可以执行以下操作:

date -v -1m +%Y%m
Run Code Online (Sandbox Code Playgroud)

我不知道 AIX 带有一个执行日期计算的命令,并且 POSIX 工具箱中没有命令,因此没有标准/可移植命令。您可以恢复perl或手动进行计算:

eval "$(date +'y=%Y m=%m')"
m=$((${m#0} - 1))
[ "$m" -gt 0 ] || m=12 y=$((y - 1)) # January case
printf '%d%02d\n' "$y" "$m"
Run Code Online (Sandbox Code Playgroud)