2012-02-23 16 views
0

我有一个bash脚本每天向我发送一个文本100天。文本消息网关和递增Bash变量每天

#! /bin/bash 
EMAIL="[email protected]" 
MESSAGE="message_content.txt" 

mail $EMAIL < $MESSAGE 

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

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

我怎么能实现一个变量计数器,这样我可以有我的文字说:

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

注意:所请求文本在$ MESSAGE文件中的位置并不重要。最后一行,第一行,中间等。

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

当然,对于最干净,最简单,最短的解决方案:)

回答

0

一个简单的答案是,在当前值导出到外部文件,读,早在稍后再次奖金真棒点。

因此,例如,创建一个名为“CurrentDay.dat”的文件,其中编号为1。

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

例如您的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 

当然,你可能需要执行一些额外的检查,以避免出乱子,但应该上班的。

+0

此外,这是相当粗糙 - 这不会增加例如,如果计算机处于关闭状态,则为DayCounter的值。 您可以输出系统时间的当前值,并在脚本中将DayCounter增加自上次消息以来经过的天数。那样,如果cronjob不是因为任何原因运行的,你的柜台不会落后一天。 – Wheels2050 2012-02-23 19:52:19

+0

在bash中,您应该使用$( jordanm 2012-02-23 19:53:54

+0

谢谢jordanm,我之前没有遇到过。我编辑了我的答案。 – Wheels2050 2012-02-23 19:54:59

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))" 
0

考虑到你的脚本是一天一次只跑,这样的事情应该工作:

#!/bin/bash 
EMAIL="[email protected]" 
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 
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 
$ 

所以,如果基准日为13日2009年2月,今天是1104天(该方案bc是计算器,它的名字已经无关公元或在基督之前程序timestamp是我的另一种自制软件,它根据可指定的格式打印时间戳;它是date的一个特殊变体,最早在date之前有写作功能,我的意思是在20世纪80年代初期)


在一个Perl的一行(假设你指定你的脚本参考日期):

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

或:

days=$(perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)') 
+0

这似乎是最明智的做法(计算从第0天开始的天数)。确保''s'说明符的GNU日期。 – 2012-02-23 21:34:06