在机器 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
另一个具有内置日期操作支持的strftime
shell(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)