Bash скрипт для временной петли - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь написать код для преобразования даты в желаемый формат и увеличения на 300 секунд при каждом запуске.

Дата в форме 2020-12-19 00: 35: 00 + 00: 000 хотите его нужно преобразовать в форму 2020-12-19T00: 35: 00Z, и после каждого увеличения запуска добавьте пять минут к отметке времени.

for run in $(seq 0 $REPEAT)
do
        echo "======================"
        VARIABLE=$( expr 300 '*' $run)
        DATE=$(date --iso-8601=seconds -d "2020-19-19T00:35:00 + $VARIABLE seconds")
        echo $DATE
        for file in ${FILELIST[@]};
        do

               echo "Running fine"
        done

done

Но я получаю вывод как:

2020-03-09T03: 05: 01 + 05: 30

Я хочу, чтобы результат был 2020-12-19T00: 35: 00Z, затем 2020-12-19T00: 40: 00Z и т. Д.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Месяц номер 19 не существует. Попробуйте использовать следующий подход:

# Get the number of seconds since Epoch
secs=$(date +%s --date="2020-9-19T00:35:00")

for run in $(seq 0 $REPEAT)
do
    echo "======================"
    # Next increment
    VARIABLE=$((300*run))

    # Add the increment seconds and translate to the desired format
    DATE=$(date --iso-8601=seconds -d "@$((secs+VARIABLE))")

    echo $DATE
    for file in ${FILELIST[@]};
    do
        echo "Running fine"
    done
done

Кстати, если вы действительно хотите иметь часовой пояс Z, вам придется немного поработать с форматом вывода.

0 голосов
/ 08 мая 2020

Как указано в Poshi , ваш скрипт использовал дату 2020-19-19, которой не существует. Как только мы это исправим, мы будем очень близки. Осталось сделать только три вещи:

  • -d "isoFormatWithoutTimezome + 3 seconds, похоже, неверно интерпретируется как
    -d "(isoFormat withTimezone='+3') seconds". При такой интерпретации завершающий seconds на самом деле не имеет смысла, но, кажется, добавляет одну секунду к дате. Чтобы предотвратить ложную интерпретацию как часовой пояс, укажите часовой пояс после даты и перед + 3 seconds:
    -d "2020-19-19T00:35:00Z + 3 seconds".

  • Установка часового пояса для вывода возможна с помощью Переменная окружения date TZ. Для UT C мы можем установить TZ как пустую строку.

  • date -I показывает UT C как +00:00 вместо Z. Чтобы изменить выходной формат, мы могли бы либо указать настраиваемую строку даты +...Z, либо просто выполнить замену строки sed s/+00:00$/Z/.

Кстати: предпочтительное соглашение об именах для переменных в bash равно НЕ ALLCAPS, поскольку переменные allcaps по соглашению являются переменными среды и имеют высокую вероятность столкновения с уже существующими переменными среды.

#! /usr/bin/env bash

repeat=5 # does 6 repeats! (retained behavior from your original script) 
for ((run = 0; run <= repeat; run++)); do
    date=$(TZ= date -Is -d "2020-12-19T00:35:00Z + $((run * 300)) sec" | sed 's/+00:00$/Z/')
    echo "$date"

    # do stuff
done

печатает

2020-12-19T00:35:00Z
2020-12-19T00:40:00Z
2020-12-19T00:45:00Z
2020-12-19T00:50:00Z
2020-12-19T00:55:00Z
2020-12-19T01:00:00Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...