0

100 日間、毎日テキストを送信する bash スクリプトがあります。

#! /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 CE までしか動作しません。私は、Y3K 修正の問題になる約 50 年前に人々が私に連絡するように、コードにメモを残しました。それはおそらく些細なことです。)

おそらく、Unix タイムスタンプの観点から作業することができます...

数値を基準日として扱い、現在のタイムスタンプを取得するスクリプト 'days_since 1234567890' を作成します (date適切な形式の仕様から; Linux ではdate '+%s'その仕事を行い、Mac OS X でも動作します)、差を取り、 86,400 (1 日の秒数) で割ります。

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。これは、もともと1980 年代初頭に機能を持っていた以前に書かれtimestampた特殊なバリアントです。)datedate


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

簡単な答えは、現在の値を外部ファイルにエクスポートし、後でもう一度読み取ることです。

したがって、たとえば、番号1を含む「CurrentDay.dat」というファイルを作成します。

次に、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

スクリプトが 1 日に 1 回だけ実行されることを考慮すると、次のように動作するはずです。

#!/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 に答える
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 に答える