在机器 A(运行 Oracle Linux Server 版本 6.4)中,我可以使用以下命令智能获取 1 个月前的日期:
$(date -d"1 month ago" '+%Y0%m')
但它在机器 B(AIX) 上不起作用,是否有其他方法可以实现此目的?两者都在.sh
文件中并运行:
sh Test.sh
机器B中显示错误:
date: illegal option -- d
Usage: date [-u] [+Field Descriptors]
答案1
它与 shell 无关,而是与date
命令有关。该-d
选项特定于该date
命令的 GNU 实现。在非 GNU 系统上,除非您将 GNU 版本安装date
为单独的软件包(可能会安装为gdate
或作为/opt/gnu/bin/date
...),否则这将不起作用。
请注意,最新版本的 ksh93 的内置命令具有类似的功能printf
:
printf '%(%Y%m)T\n' '1 month ago'
(另请参阅zsh
另一个具有内置日期操作支持的 shell(模块strftime
中内置zsh/datetime
))。
其他一些date
实现也具有调整日期的功能。例如,使用 BSD date
,您可以执行以下操作:
date -v -1m +%Y%m
我不知道 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"
答案2
date -d...
在 AIX/ksh 中不起作用,因此请使用下面的一个,它在 AIX 上完美运行:
TZ=aaa$(expr $(expr `TZ=aaa24 date +%d` + 1) \* 24) date +%m