Дата приращения оболочки Korn в формате ГГГГММДД - PullRequest
1 голос
/ 08 января 2020

Мне нужно увеличить дату с указанным c форматом ГГГГММДД (примеры: 20190401 или 20190523). 0 должны быть там для одиночных ди git дней и месяцев.

Я хотел бы, чтобы аргументы строки входного cmd ex ./script.ksh (число дней до приращения) (дата начала) или ./script.ksh (дата начала) (дата окончания)

Я сделал ужасную версию, которая приняла ./script.ksh (количество дней) (год) (месяц) (день) например: ./script.ksh 7 2019 04 10

#The amount of days to load by
Days=$1

Year=$2
Month=$3
Day=$4

count=0

while (($count < $Days)) 
do
    #The date of the file in format: YYYYMMDD
    if [[ $Day -eq "1" || $Day -eq "2" || $Day -eq "3" || $Day -eq "4" || $Day -eq "5" || $Day -eq "6" || $Day -eq "7" || $Day -eq "8" || $Day -eq "9" ]];
    then
        Day=0$Day
    fi

    Date=$Year$Month$Day
    print $Date

    #Check if month then day and increment accordingly

    #months with 31 days
    if [[ ($Month -eq "01" || $Month -eq "03" || $Month -eq "05" || $Month -eq "07" || $Month -eq "08" || $Month -eq "10" || $Month -eq "12") && ($Day == 31)]];
        then
                #If Dec, 31 XXXX
                if [[ $Month -eq "12" && Day == 31 ]];
                then
                        Month=01
                        Day=01
                        Year=$Year+1
                fi
                if((Day == 31));
                then
                        Month=$Month+1
                        Day=1
                fi
        #Months with 30 days
        elif [[ ($Month -eq "04" || $Month -eq "06" || $Month -eq "09" || $Month -eq "11") && ($Day == 30) ]];
        then
                if(($Day == 30));
                then
                        $Month=$Month+1
                        Day=01
                fi
        #The tricky February leap year
        elif [[ ($Month -eq "02") && ($Day == 28 || $Day == 29) ]];
        then
                leapcheck=$(($Year % 4))
                if(( leapcheck == 0 && Day == 29 ));
                then
                        Month=$Month+1
                        Day=01

                elif(( $leapcheck != 0  && $Day == 28 ));
                then
                        Month=$Month+1
                        Day=01
                fi
        else
                (( Day=$Day+1 ))
        fi

        ((count=$count+1))
done

, который будет печатать 20190410 до 20190416. Однако существуют проблемы с увеличением месяца и дней, когда 0 удаляется и для Мой месяц вообще не увеличивается. Я уверен, что должен быть более простой и лучший способ, чем моя попытка. Я новичок в сценариях оболочки Korn.

1 Ответ

0 голосов
/ 08 января 2020

Если у вас есть дата (с опцией -d), простой способ сделать это - преобразовать дату во время секунд с начала эпохи, добавить количество дней в секундах и затем преобразовать их вернитесь к нужному формату:

days=5
now=20190401

now_sec=$(date -d "${now:0:4}-${now:4:2}-${now:6:2} 11:00:00" +%s)
then_sec=$((now_sec + days * 3600 * 24))
then=$(date -d @"$then_sec" +%Y%m%d)

echo "$then" # will output 20190406

${now:0:4} извлекает часть строки, см. расширения параметров .

...