Скрипт Bash, который может печатать все даты между двумя периодами iso8601 - PullRequest
1 голос
/ 28 октября 2019

У меня есть следующий сценарий незавершенного выполнения в bash.

#!/bin/bash
# usage:
# ./script.sh <iso8601_period>


period_ago() {
    if [[ $1 =~ P(([0-9]+)M)?([0-9]+)D ]]; then
        local months=${BASH_REMATCH[2]:-0}
        local days=${BASH_REMATCH[3]}
        date -d "$months months $days days ago" "+%Y/%m/%d"
    fi
}

period="$(period_ago $1)"

max=3
for (( i=0; i <= $max; ++i ))
do
    temp=$i
    if (( ${#temp}  < 2 ))
    then
       temp="0$temp"
    fi

    echo $period/$temp
done

, и когда вы запустите его, в настоящее время он напечатает:

2019/07 /20/00

2019/07/20/01

2019/07/20/02

2019/07/20/03

Я пытаюсь выяснить, могу ли я сделать что-то подобное при запуске сценария (передавая два аргумента), и он даст мне даты между двумя периодами ISO8601, в данном случае 100 дней назад и 99 дней назад?

. / Script P100D P99D

2019/07/20/00

2019/07/20/01

2019/07/20/02

2019/07/20/03

2019/07/21/00

2019/07/21/01

2019/07/21/02

2019/07/21/03

1 Ответ

1 голос
/ 28 октября 2019

Опираясь на функцию period_ago и цикл для вывода строк 'max' на уже разработанных линиях:

period_ago {
    ...
}

start=$(period_ago $1)
end=$(period_ago $2)
max=3

d=$start
until [[ $d > $end ]] ; do

# Original Loop to max.
   for (( i=0; i <= $max; ++i )) 
   do
    temp=$i
    if (( ${#temp}  < 2 ))
    then
       temp="0$temp"
    fi

    echo $d/$temp
  done
# Bump to next date
  d=$(date -d "$d tomorrow" +'%Y-%m-%d')

done

Более компактная версия

start=$(period_ago $1)
end=$(period_ago $2)
max=3

d=$start
until [[ $d > $end ]] ; do

# Original Loop to max.
   for (( i=0; i <= $max; ++i )) ; do
       printf "%s/%02d\n" $d $i
   done
# Bump to next date
  d=$(date -d "$d tomorrow" +'%Y/%m/%d')

done

...