0

我有一个 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

4 回答 4

1

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

该系统的最大优势是参考日期不会(经常)更改,因此脚本不会(经常)更改,并且没有外部文件可以存储信息。

可能有一些方法可以使用标准的 Unix 工具实现相同的效果,但我还没有坐下来制定出可移植的解决方案。我可能认为它是使用 Perl 的条款。(C 程序只能工作到公元 2999 年;我在代码中留了一个便条,让人们在它成为 Y3K 修复问题之前大约 50 年与我联系。这可能是微不足道的。)

您也许可以根据 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 或 Before Christ 无关。该程序timestamp是我的另一个自制程序,它根据格式打印时间戳可以指定;它是date最初在date具有功能之前编写的专用变体,我的意思是在 1980 年代初。)


在 Perl 单行中(假设您在脚本中指定了参考日期):

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

或者:

days=$(perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)')
于 2012-02-23T19:55:07.680 回答
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

当然,您可能需要实施一些额外的检查以避免出现问题,但这应该可以正常工作。

于 2012-02-23T19:48:30.460 回答
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))"
于 2012-02-23T19:52:53.873 回答
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
于 2012-02-23T19:54:38.787 回答