Шлюзы текстовых сообщений и увеличение переменной Bash Daily - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть скрипт 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 ]

1 голос
/ 23 февраля 2012

Для наших систем ночной сборки я написал программу на 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 г., сегодня - день 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)')
0 голосов
/ 23 февраля 2012

Единственный способ сделать это - сохранить дату в файле и читать из этого файла каждый день.Я бы предложил хранить время эпохи.

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 голосов
/ 23 февраля 2012

Учитывая, что ваш скрипт выполняется только один раз в день, что-то вроде этого должно работать:

#!/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
0 голосов
/ 23 февраля 2012

Простой ответ - экспортировать текущее значение во внешний файл и позже прочитать его снова.

Так, например, создайте файл с именем «CurrentDay.dat», в котором будет номер 1.

Затем в вашем 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

Конечно, вам может понадобиться выполнить некоторые дополнительные проверки, чтобы избежать ошибок, но это должно работать как есть.

...