【问题标题】:Need to generate time values between two given times in bash需要在 bash 中生成两个给定时间之间的时间值
【发布时间】:2018-07-02 09:46:33
【问题描述】:

所以我是 bash 的新手,我必须制作一个脚本,其中包含动态回显的行,并带有不断变化的时间戳 HH:MM。 所以当我给说

sh run.sh 03:40 05:40

它应该在给定范围之间的所有时间回显 例如:03:31 03:32 ........ 05:39 05:40

我知道循环非常简单,但我无法弄清楚。有什么帮助吗?

我有这个不太好的代码,现在还不能工作。

echo "Enter from Hour:"
read fromhr
echo "Enter from Min:"
read frommin
echo "Enter to Hour:"
read tohr
echo "Enter to Min:"
read tomin
while [  $fromhr -le $tohr ]; do
    while [  $frommin -le $tomin ]; do
        echo "$fromhr:$frommin"
        if [ $frommin -eq 60 ]; then
            frommin=0
            break
        fi
        ((frommin++))
    done
    if [ $fromhr -eq 24 ]; then
        fromhr=0
    fi
    ((fromhr++))
done

【问题讨论】:

  • 将您的时间转换为纪元时间戳,增量,以您想要的格式打印。

标签: linux bash shell loops while-loop


【解决方案1】:

请注意,如果您比较的是 from 小于 to,那么您不太可能达到小时/日期的变化。比如说,从 20:00 迭代到 05:00 甚至不会发生;如果您从 12:38 迭代到 17:12,则不会有任何分钟更改(内部循环的条件立即为假)。建议几个步骤。

  1. 将每个条件的运算符更改为-ne' rather than-le'。

  2. 在各自的溢出检查之前移动两个增量(frommin++fromhr++)(否则您将不断在输出中看到 24 小时 60 分钟)。

试试这个,看看你是否想进一步美化它。

【讨论】:

    【解决方案2】:

    示例代码:

    #!/bin/bash
    
    # Convert the given start/end time to seconds
    # Replace time string with required HH:MM value
    start_t=`date -d "03:30" +%s`
    end_t=`date -d "03:33" +%s`
    
    while [ ${start_t} -le ${end_t} ]; do
        # Print time in HH:MM format
        date -d @${start_t} +"%H:%M"
    
        # Increment minute part
        start_t=$(expr ${start_t} + 60)
    done
    

    【讨论】:

      【解决方案3】:

      示例 1:仅使用 bash,速度更快:

      #!/bin/bash
                           # - input data
      fh=03                #   from hour
      th=05                #   to hour
      fm=30                #   from minute
      tm=30                #   to minute
      
      for ((h=fh;h<=th;h++)); do
        for ((m=1;m<=59;m++)); do
          [[ $h -le $fh && $m -lt $fm ]] && continue
          [[ $h -ge $th && $m -gt $tm ]] && break
          printf '%02d:%02d\n' $h $m
        done
      done
      

      示例2:使用date来回转换,代码更短,但速度慢很多:

      #!/bin/bash
                                    # 1) input data
      ft='03:30'                    #    from time
      tt='05:30'                    #    to time
                                    # 2) convert to Epochtime (second)
      f=`date +%s -d "$ft"`         #    from
      t=`date +%s -d "$tt"`         #    to
      
      for ((s=f;s<=t;s+=60)); do    # 60 seconds = 1 minute
        date +%H:%M -d @$s          # convert from Epochtime to H:M
      done
      

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多