我有一个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文件中请求的文本的位置无关紧要。最后一行,第一行,中间等。
这里答案的唯一要求是我知道它与第一天相对的日期,第一天是脚本开始的那一天。
当然,对于最干净,最简单,最简短的解决方案,奖励真棒点数:)
答案 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