在 Unix (AIX) 中获取今天减去一年的日期

Get today's date minus one Year in Unix (AIX)

我需要找到今天的日期,然后减去年份并将该日期格式化为 YYYY-MM-dd 格式。

我可以使用我编写的脚本来完成此操作,但显然它仅与 bash 兼容。我需要它与 AIX 兼容。

lastYear=`date +'%Y-%m-%d' -d 'last year'`
searchDate="$lastYear 00.00.00";
echo "Retrieving data start from $searchDate"
myquery="myquery >= '$searchDate'"

在 AIX 机器上 运行 的结果是它只传递 $searchDate 的“00:00:00”部分,日期没有像我希望的那样在时间之前添加前缀。为了在 Linux/Unix 个变体中实现最大兼容性,最安全的编写方法是什么?

谢谢!

检查下面更新的部分

原答案

试试这个。它使用-v标志来显示将当前日期调整负一年的结果-1y

searchDate=$(date -v-1y +'%Y-%m-%d')
echo "Retrieving data start from $searchDate"
myquery="myquery >= '$searchDate'"

这是输出:

Retrieving data start from 2017-06-21

注意:我确实尝试 运行 您在脚本文件中使用 bash shebang 提供的行,但是 运行 变成了 illegal time format 错误并且输出为 00:00:00。我上面提供的脚本 运行s 在我的 unix 系统上很干净。

希望这对您有所帮助。祝你好运!


更新部分

访问ShellCheck.net

它是测试 sh、bash、dash 和 ksh(AIX 的默认值)shells 之间代码兼容性的好资源。

确定实际问题

当我输入你的代码时,它清楚地识别出被认为是遗留的语法并建议如何修复它,并给出了这个 link with an example and a great explanation。这是输出:

lastYear=`date +'%Y-%m-%d' -d 'last year'`
          ^__Use $(..) instead of legacy `..`.

因此,看起来您可以使用您编写的代码,只需进行一点小改动:

lastYear=$(date +'%Y-%m-%d' -d 'last year')


注意:这个问题已经有一个公认的答案,但我想分享这个资源,因为它可能会帮助其他人在将来解决 shell 类似的兼容性问题。

为什么搞得这么复杂?

#!/bin/ksh

typeset -i year=$( date +%Y )
(( year -= 1 ))
typeset rest=$( date +%m-%d )
echo "${year}-${rest}"

这应该适用于任何 shell。如果您使用 sh 替换

$( ... )

背部抽搐

` ... `

但是对于 bash 和 ksh 我使用 $( ... ) -- 只是个人喜好。