【问题标题】:Shell Script with time windows and a break in between带有时间窗口和中间中断的 Shell 脚本
【发布时间】:2014-06-17 07:14:41
【问题描述】:

我不知道如何让该脚本以正确的方式工作。

如果下标在时间范围内(例如 0800 - 1700)并且不在暂停时间 1200 - 1400 内,则下标将运行。

这是我的 shellscript。

if [[ "$socket8_timestart" -le "$timenow"  &&  "$timenow" -le "$socket8_timestop" ]] &&
[[ "$timenow" -lt "$socket8_breakstart"  &&  "$socket8_breakstop" -gt "$timenow" ]] ; then
subscript

你能帮帮我吗?

【问题讨论】:

  • 我认为你的最后条款应该颠倒过来。您希望 $timenow 大于 $socket8_breakstop 以恢复子脚本。

标签: bash shell time shellcode


【解决方案1】:
"$timenow" -lt "$socket8_breakstart"  &&  "$socket8_breakstop" -gt "$timenow" 

这个条件只在 break 之前给出 true,而不是在 break 内(如预期的那样),也不在 break 之后。这可能是您看到的问题。

考虑稍微改变逻辑:

#!/bin/bash
timenow="1330"
socket8_timestart="900"
socket8_breakstart="1300"
socket8_breakstop="1400"
socket8_timestop="1500"

(( timenow > socket8_timestart &&
   timenow < socket8_timestop
)) && ((
   timenow < socket8_breakstart ||
   timenow > socket8_breakstop
)) && echo "running"

另外,不要将 break 视为例外,而是将整个间隔分成两个,一个 pre-break 和一个 post-break。如果 pre-break 或 post-break 匹配,则运行脚本。

当心您所在时代的前导零。 暂停测试已被放入单独的子句中,以便于分解。不需要额外的子句,但可以简化事情。

【讨论】:

  • 好的,我明白了,但我不知道如何解决这个问题。
  • 您的条件的第二部分应该表达类似“如果它在休息之前或休息之后”而不是“如果它在休息开始之前和休息结束之前” - 现在就是这种情况。存在一个 OR 运算符,看起来像“||”。考虑使用类似 "if (( time 的结构使您的脚本更具可读性
  • if [[ "$socket8_timestart" -le "$timenow" && "$timenow" -le "$socket8_timestop" ]] && [[ "$timenow" -lt "$socket8_breakstart" || "$timenow" -gt "$socket8_breakstop" ]] ;那么
  • 当你全职工作时date +"%H" | awk '/^0/ {sub("0","");} {print}'
  • 谢谢,你们是天才。感谢您帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2015-05-08
  • 2016-09-15
  • 1970-01-01
  • 2023-03-30
  • 2013-05-26
相关资源
最近更新 更多