为变量和算术运算分配日期并不适用于Solaris shell

时间:2017-11-05 11:29:04

标签: bash shell date solaris-10

我在Solaris中尝试以下命令。我在bash

中尝试了所有这些
START_DT="$(date --date='2013-04-01' +'%Y-%m-%d')"

它给我错误

-bash-3.2$ START_DT="$(date --date='2013-04-01' +'%Y-%m-%d')"
date: illegal option -- date=2013-04-01
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

-bash-3.2$ START_DT=$(date -d '2013-04-01' +%Y-%m-%d)
date: illegal option -- d
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

当我在RedHat中尝试相同时,它可以工作。

$ START_DT="$(date --date='2013-04-01' +'%Y-%m-%d')"
$ echo $START_DT
'2013-04-01'

以同样的方式,某些算术运算不起作用。通过算术运算,我的意思是在给出日期等10天后添加。

我尝试了多个参考文献 - 123但似乎没有任何作品

但这一切都适用于Redhat。可能是我有一个非常旧的Solaris版本,我只需要使用此服务器来处理此问题陈述

1 个答案:

答案 0 :(得分:0)

我没有要测试的Solaris 10机箱,但它应该带有perl:

perl -MTime::Piece -sle '
    ($fmt = shift @ARGV) =~ s/^\+//;
    print Time::Piece->strptime($date, $datefmt)->strftime($fmt)
' -- -date='2017-03-15' -datefmt='%Y-%m-%d' '+%d/%m/%y'
15/03/17

使用Time :: Piece :: strptime函数,您需要指定日期时间字符串的日期时间格式。

你可以把它包装成一个bash函数,如:

mydate () {
    local OPTIND OPTARG date datefmt fmt opt
    while getopts ":d:f:" opt; do
        case $opt in
            d) date=$OPTARG ;;
            f) datefmt=$OPTARG ;;
            :) echo "error: missing argument for -$OPTARG; return 1 ;;
            *) echo "error: unknown argument: -$OPTARG; return 1 ;;
        esac
    done
    shift $((OPTIND-1))
    if [[ -z "$date" ]]; then
        command date "$@"
    elif [[ -z "$datefmt" ]]; then
        echo "error: missing -f date format for input date $date"
        return 1
    else
        if [[ -z "$1" ]]; then
            fmt="%c"
        else
            fmt=${1#+}
        fi
        perl -MTime::Piece -sle 'print Time::Piece->strptime($d, $df)->strftime($f)' -- \
            -d="$date" \
            -df="$datefmt" \
            -f="$fmt"
    fi
}