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

时间:2018-06-21 21:01:05

标签: shell 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变体之间实现最大兼容性,最安全的写法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

结帐更新了以下部分

原始答案

尝试一下。它使用-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。我上面提供的脚本可以在unix系统上正常运行。

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


更新部分

访问ShellCheck.net

这是测试sh,bash,dash和ksh(AIX的默认)shell之间的代码兼容性的好资源。

确定实际问题

当我输入您的代码时,它清楚地标识了被认为是传统的语法,并提出了解决方法,并给出了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兼容性问题。

答案 1 :(得分:1)

为什么要这么复杂?

#!/bin/ksh

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

这应该在任何shell中都有效。如果使用sh替换

$( ... )

带反斜线

` ... `

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