2012-02-23 15 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