文本消息网关&每日递增Bash变量

时间:2012-02-23 19:37:00

标签: bash cron crontab cron-task

我有一个bash脚本每天向我发送一个文本,为期100天。

#! /bin/bash
EMAIL="my-phone-gateway@address.net"
MESSAGE="message_content.txt"

mail $EMAIL < $MESSAGE

使用crontab,我可以每天向我发送静态$ MESSAGE。

除了硬编码100天的文本外;)

我如何实现变量计数器,以便我可以让我的文本说:

第一天

"Today is Day #1",第二天"Today is Day #2"等等?

注意:$ MESSAGE文件中请求的文本的位置无关紧要。最后一行,第一行,中间等。

这里答案的唯一要求是我知道它与第一天相对的日期,第一天是脚本开始的那一天。

当然,对于最干净,最简单,最简短的解决方案,奖励真棒点数:)

4 个答案:

答案 0 :(得分:1)

对于我们的夜间构建系统,我编写了一个C程序来进行计算(使用本地专有库将日期存储为自参考日期以来的天数)。基本上,给定(不变)参考日期,它报告自参考日期以来的天数。因此,cron脚本的第一天会有一个硬连线,程序会报告自那时起的天数。

这个系统的一大优点是参考日期不会改变(经常),所以脚本不会(经常)改变,并且没有外部文件来存储信息。

可能有一些方法可以通过标准的Unix工具实现相同的效果,但我没有坐下来制定便携式解决方案。我可能会认为使用Perl的条款。 (C程序只能在2999 CE工作;我在代码中留下了一个注释,让人们联系我大约50年才成为Y3K修复的问题。这可能是微不足道的。)

你可能会在Unix时间戳方面工作......

创建一个脚本'days_since 1234567890',将该数字视为参考日期,获取当前时间戳(来自date并具有适当的格式规范;在Linux上,date '+%s'将完成该工作,并且它也适用于Mac OS X),取差值并除以86,400(一天中的秒数)。

refdate=1234567890
bc <<EOF
scale=0
($(date '+%s') - $refdate) / 86400
EOF

一个例子:

$ timestamp 1234567890
1234567890 = Fri Feb 13 15:31:30 2009
$ timestamp
1330027280 = Thu Feb 23 12:01:20 2012
$ refdate=1234567890
$ bc <<EOF
> scale=0
> ($(date '+%s') - $refdate) / 86400
> EOF
1104
$

所以,如果参考日期是2009年2月13日,那么今天是1104天。(程序bc是计算器;它的名字与Anno Domini或在基督之前无关。程序{{1}我的另一个自制软件根据可以指定的格式打印时间戳;它是timestamp的专用变体,最初是在date具有该功能之前的日子写的,我的意思是20世纪80年代初。)


在Perl单线程中(假设您在脚本中指定了引用日期):

date

或:

perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)'

答案 1 :(得分:0)

一个简单的答案是将当前值导出到外部文件,稍后再读回来。

因此,例如,创建一个名为“CurrentDay.dat”的文件,其中包含数字1。

然后,在你的bash脚本中,读入数字并递增它。

e.g。你的bash脚本可能是:

#!/bin/bash

#Your stuff here.

DayCounter=$(<CurrentDay.dat)
#Use the value of DayCounter (i.e. $DayCounter) in your message.

DayCounter=$((DayCounter + 1))

echo $DayCounter > CurrentDay.dat

当然,您可能需要执行一些额外的检查以避免出现问题,但这应该按原样运行。

答案 2 :(得分:0)

实现此目的的唯一方法是将日期存储在文件中,并每天从该文件中读取。我建议存储纪元时间。

today=$(date +%s)
time_file="~/.first_time"
if [[ -f $time_file ]]; then
   f_time=$(< "$time_file")
else
   f_time=$today
   echo "$f_time" > "$time_file"
fi

printf 'This is day: %s\n' "$((($today - $f_time) / 60 / 60 / 24))"

答案 3 :(得分:0)

考虑到您的脚本每天只运行一次,这样的事情应该有效:

#!/bin/bash
EMAIL="my-phone-gateway@address.net"
MESSAGE="message_content.txt"
STFILE=/tmp/start.txt
start=0
[ -f $STFILE ] && start=$(<$STFILE)
start=$((start+1))
MESSAGE=${MESSAGE}$'\n'"Today is Day #${start}"
echo "$start" > $STFILE
mail $EMAIL < $MESSAGE