带有日期的脚本在 Linux 上有效,但在 AIX 上无效

带有日期的脚本在 Linux 上有效,但在 AIX 上无效

我编写了一个脚本,该脚本在 Linux 上运行良好,但在 AIX 7.2 上失败。我的脚本使用带 -d 的命令date。该脚本的目的是获取不是周六、周日或节假日的最后一天。为了验证某一天是否是假期,我执行了一个查询,并以 YYYY-MM-DD 格式传递日期。

脚本是这样的:

D_MINUS_ONE=

GetLastDay()
{
        current_day=""
        day_of_week=$(date -d "$1 -1 days" +'%w')
        if [ $day_of_week -eq 0 ]
        then
                current_day=$(date -d "$1 -3 days")
        else
                current_day=$(date -d "$1 -1 days")
        fi
        db2 -x "SELECT COUNT(*) FROM HOLIDAY WHERE DT_HOLIDAY='$(date -d "$current_day" +'%Y-%m-%d')'" | read lines
        if [ lines -gt 0 ]
        then
                GetLastDay $(date -d "$current_day" +'%Y-%m-%d')
        fi
        D_MINUS_ONE=$(date -d "$current_day" +'%Y-%m-%d')
}

GetLastDay $1

echo $D_MINUS_ONE

答案1

-d是一个 GNUdate扩展(busyboxast-open date有一个,但工作方式不同)。

不过AIX 自带了ksh93,所以 GNU 不需要date获取前一个工作日:

day=2016-01-01
previous_working_day=$(D=$day ksh93 -c '
  printf "%(%F)T" "$D, $(($(printf "%(%w)T" "$D") == 1 ? 3 : 1)) day ago"')

答案2

D_MINUS_ONE=

GetLastDay()
{
        last_day=$(D=$1 ksh93 -c 'printf "%(%F)T" "$D, $(($(printf "%(%w)T" "$D") == 1 ? 3 : 1)) day ago"')
        db2 -x "SELECT COUNT(*) FROM HOLIDAY WHERE DT_HOLIDAY='$last_day'" | read lines
        if [ lines -gt 0 ]
        then
                GetLastDay $last_day
        fi
        D_MINUS_ONE=$last_day
}

GetLastDay $1

echo $D_MINUS_ONE

相关内容