[英]Time Variables in Bash Scripting
如果每次有3个不同的脚本在每次写入文件时都在不同的时间运行,那么如何编写bash脚本以仅在特定的时间运行特定的脚本。 这并不像cron作业那么简单(尽管cron可能会根据时间交换出.sh文件),但我正在寻找时间变量。
例如:
If 9am-11:30 am run scriptA.sh if file.txt is changed.
If 11:30am-5:45pm run scriptB.sh if file is changed.
If 5:46pm-8:59am run scriptC.sh if file is changed.
我问了类似的问题,但我对所要查找的变量或如何定义它们的了解不够清楚。
我看到有两个问题。 1,如何确定当前小时是否在特定范围内。 2,如何确定文件是否最近被修改。
这是我的处理方式:
#!/bin/bash
now=$( date +%s )
current_hour=$( date +%H )
file_mod=$( ls -l --time-style=+%s file.txt | awk '{print $(NF-1)}' )
file_age=$(( $now - $file_mod ))
if [[ $current_hour -gt 9 ]] && \
[[ $current_hour -lt 11 ]] && \
[[ $file_age -lt 3600 ]]
then
./scriptA.sh
fi
在这里,我使用bash运算符进行数字比较:-gt,-lt
为了获得更精细的时间,您需要计算自午夜以来的时间。 也许像这样:
hour=$( date +%H )
min=$( date +%M )
minutes=$( echo "( 60 * $hour ) + $min" | bc -l )
eleven_thirty=$( echo "( 60 * 11 ) + 30" | bc -l )
比较时间戳来确定是否需要工作,进行或不进行传统的工具是make
。 它的默认行为是为指定目标计算一个依赖链,并确定是否有任何依赖文件已更改。 如果不是,则不需要重新设定目标。 这是避免重新编译的好工具,但很容易扩展到其他任务。
.made
,您将创建一个标志文件(例如.made
)并将其指定为依赖于您的file
。 现在,如果file
已更改, .made
需要重新创建.made
,因此make
将运行您指定的命令。 在这种情况下,我们将运行一个简单的Shell脚本,然后touch .made
以将最新的(成功的)运行时间传达给将来的运行。
剩下的是配方可以在不同的时间运行不同的命令。 我的解决方法是简单的case
陈述。 注意, make
解释美元符号,因此我们需要将应传递给外壳的美元符号加倍。
.made: file
case $$(date +%H:%M) in \
09:* | 10:* | 11:[0-2]? ) \
scriptA.sh ;; \
11:[3-5]? | 1[2-6]:* | 17:[0-3]? | 17:4[0-5]) \
scriptB.sh;; \
17:4[6-9] | 17:5? | 1[89]:* | 2?:* | 0[0-8]:* ) \
scriptC.sh;; \
esac
touch $@ # $@ expands to the current target
整个case
语句需要作为一条逻辑行传递到shell,因此我们以那些讨厌的反斜杠结束以换行。
还要注意, make
对于缩进很挑剔; 配方中的每一行(逻辑行)都应以文字制表符开头。
make
的默认行为是运行文件中的第一个目标。 此Makefile
仅包含一个目标,因此make
等同于make .made
。
还要注意, make
有关退出代码的烦恼; 如果scriptA
, scriptB
或scriptC
可以以非零退出状态退出(被make
视为致命错误),并且.made
文件将不会更新。 (不过,您可以轻松地对此加以防范 。)
好吧,由于Bash变量只能存储string
或integer
,因此“ date”变量只是字符串操作,如以下示例所示:
hours=`date +%H`
minutes=`date +%M`
sum=$(($hours + $minutes))
digit=`echo $sum | sed -e 's/\(^.*\)\(.$\)/\2/'` # counts total digits
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.