Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于时间循环的Bash脚本_Bash_Shell - Fatal编程技术网

用于时间循环的Bash脚本

用于时间循环的Bash脚本,bash,shell,Bash,Shell,我试图编写代码,将日期转换为所需格式,并在每次运行中增加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=sec

我试图编写代码,将日期转换为所需格式,并在每次运行中增加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,依此类推。

第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
时区,你必须稍微调整一下输出格式。

正如你的脚本所指出的那样,使用了不存在的日期
2020-19-19
。一旦我们解决了这个问题,我们就非常接近了。只剩下三件事要做:

  • -d”在没有时间限制+3秒的情况下,似乎被误解为
    -d”(isoFormat With timezone='+3')seconds“
    。使用此解释,尾随的
    seconds
    实际上没有意义,但似乎在日期上增加了一秒钟。为防止错误解释为时区,请在日期之后和
    +3秒之前指定时区:
    -d“2020-19-19T00:35:00Z+3秒”

  • 可以使用
    date
    的环境变量
    TZ
    设置输出的时区。对于UTC,我们可以将
    TZ
    设置为空字符串

  • date-I
    将UTC显示为
    +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

嗯,非常确定您可以在
date-d
中添加秒数,至少使用GNU date。
date-d“现在+3600秒”
在一小时(=3600s)内打印日期从现在开始。你是对的,@Socowi。我在尝试添加此日期时遇到了一些问题,我认为这是不可能的。日期的输入格式并不容易。是的,你永远不知道
-d
接受什么和拒绝什么。即使在阅读了(稀疏的)文档后,我仍然必须猜测和测试哪些有效,哪些无效。事实上,要求“2020-9-19T00:35:00+1秒“不起作用。
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