csillag az argumentumokban

Régi tervem, hogy írok egy kis scriptet ami roppant rövid email -ket küld nekem, lokálisan (exim4 smart host). A levelek és a küldési időpont a crontab bejegyzéseihez hasonlítana, így valahogy:
* 03 07 08 * tovis@localhost "Tamás névnap" "Tamás barátom"

A mezők sorban: év,hó,nap,óra,perc,címzett,téma,tartalom
Ezek amolyan emlékeztetők lennének. Eddig jutottam:


check_stamp()
{
  # itt kellene az időt ellenőríznem
}
grep -v '^#' $1 | while read ROW
do
  check_stamp $ROW
done

A dolog jól is menne (a check_stamp $1=év $2=hó stb. megkapja) ha nem lennének a definícióban csillagok, ezeket a shell szépen behelyettesíti az adott könyvtárban lévő fájlok nevével :(
Persze használhatnék valami mást a csillag helyett - mondjuk '-' - de szeretném megőrizni a "konvenciókat". Van valami ötlet hogy lehetne rávenni a shell -t, hogy átmenetileg NE értelmezgesse az argumentumokat? Ha az egész sort ($ROW) idézőjelekbe teszem, akkor ott vagyok ahonnan indultam a check_stamp az egész sort megkapja, így épp semmi értelme. Talán mezőnként és awk? - jó hosszú lesz a script csak emiatt, nem túl "elegáns". Viszont minden csillagot = bármi, behelyettesíthetném az aktuális értékkel (év, hó, nap stb.).
Esetleg sed? - minden csillagot a sorban lecserélni. Talán még ez a legjobb. Tudtok valami más tippet?

Hozzászólások

Szerintem arra próbál utalni, hogy $v helyett "$v" kéne. Ebben teljesen egyetértünk, bár nem jövök rá, hogy ez hol segít a problémán. Az tény, hogy a check_stamp hívása rossz, mert oda kell az idézőjel, de gondolom magában a check_stamp rutinban kellene korrekten hivatkozni az átadott paraméterekre. Mondjuk én inkább valahogy így csinálnám:


grep -v '^#' crontab | while read perc ora nap honap hetnapja parancs ; do
check_stamp "$perc" "$ora" "$nap" "$honap" "$hetnapja"
....
akarmi a $parancs felhasználásával

És persze a check_stamp-ban pontosan 5 paramétert fogsz kapni, és ha abban is "$1" (tehát idézőjeles) formában hivatkozol, akkor az nem lesz gond.

Ami nem tiszta, hogy most akarsz egy új cront írni, vagy mi van?

Van egy fájlod benne az adatok, dátum, esemény. A cronból futtatott script dátumot hasonlít és levelet küld ha kell. Nem látok csillagot a történetben!
Ill, nem kell neked csillag sehova! Minek?
c

A terv az, hogy a script napjában 1 vagy néhányszor lefut és végignézi az akár 100 soros listát. Ennyi vacakot nem fogok soronként a cronba begépelgetni, minden alkalommal.

* Én egy indián vagyok. Minden indián hazudik.

ki tudod menteni a crontab tartalmát fájlba és utána vissza is tudod tölteni, akár áttelepítés után is, ha zavar hogy sok van benne akkor ha egy névnapot már elküldött akkor egy szkript ki is törölheti az adott sort a cronból, majd újévkor töltöd be az eredeti hossszú listát, így év vége felé soványodik a crontab. év elején megint betöltöd az eredetit névnap listát és kezded előröl.
Ez a megoldás év vége felé egész elegánsan mutat :D

szerk: közben látom, hogy már közel a megoldás :)

Az az igazság, hogy amúgy is elég intenzíven használom a crontabot, nem szeretném összeszemetelni.
Sokkal szimpatikusabb, egy crontab bejegyzés a kis szerény felhasználói azonosítómmal, egy kis script és egy szép nagy text állomány a saját home -on belül.

* Én egy indián vagyok. Minden indián hazudik.

Mindenesetre ha ilyet akarnék csinálni, nem textben tárolnám a feladatokat, hanem sqlite db-ben.
Miért?
Mert nagyon elegánsan lehetne a crontól kapott időszakos impulzusra (saját szlípelgetés helyett) selecttel leválogatni mindazon rekordokat, amelyek megfelelő időparaméterei megfelelnek (azonosak, v. csillagozottak) az aktuális impulzuséival.
1-2 célmező bevezetésével az alapértelmezett akció helyett akár szkriptsorokat is le lehet futtatni - azokat persze szintén a db-ben tárolva, h egyetlen fájl átmásolásával akárhol ott legyen a cronbancron.

Viszont nem akarok ilyet csinálni (de nem merem mondani, hogy soha nem hozhat ilyet a sorsom).

A legegyszerűbb talán az, hogy a fájlban maradjon asterisk, a scripten belül viszont sed segítségével írd át valami másra, amit nem használsz, és nem is értelmeződik.


#!/bin/bash

check_stamp(){
  echo "check_stamp:  '$1'  '$2'  '$3'  '$4'  '$5'  '$6'  '$7'  '$8'"
}

(
  egrep -v '^(#|\s*$)' $1 | while read ROW ; do
    set -f
    eval check_stamp $ROW
  done
)<<END

* 03 07 08 * tovis@localhost "Tamás névnap" "Tamás barátom"

END

A sed nyert!


check_stamp()
{
  # itt kellene az időt ellenőríznem
}
grep -v '^#' $1 | sed 's/\*/any/g' | while read ROW
do
  check_stamp $ROW
done

Minden csillagot lecseréli az "any" kulcsszóra. Már csak akkor van gond ha a "téma" vagy a "tartalom" csillagot tartalmaz :(

* Én egy indián vagyok. Minden indián hazudik.

Erre miért nem inkább egy célprogramot használsz? Jó, tudom, kihívás :)
Pl. a taskwarrior esetében:

task ls due:today

Szerk.: ismétlődést is lehet kérni a taskwarrior-ban, frequency mező. Van ismétlődés évente is (annual, yearly, 1y vagy hasonló, ahogy a manualban olvasom).
Ezt sokkal könnyebb kezelned, mint egy saját szkriptet. Bár kevesebb munka is van vele.

Ez jó pofa! A Debian csomag neve "task".
Viszont nem, nekem mindenképpen a levelezésbe érdemes "beszúrnom" üzeneteket, ezt tuti olvasom! (Ráadásul, helyből sms -t is küldhetek a telefonomra ha az kell). Persze, kavintont szedni egyszerűbb lenne :)
Az itt lévő a dolgok (pl. névnap, szülinap, vagy leolvasni a gázórát 1 -én) olyan dolgok amiről hajlamos vagyok elfeledkezni és a mindennapi tevékenységemben egyfajta "megszakítást" igényel, simán belefeledkezem a dolgaimba, arról nem is beszélve ha valami közbejön a szokásos ritmushoz képest.

* Én egy indián vagyok. Minden indián hazudik.

Már én arra gondoltam, hogy ez lenne az, ami a csillag karaktert kiváltaná. Ezután lenne egy szkripted, ami generálna egy output-ot ezekből a task-os kimenetekből:

TODAY=$(task ls due:today | grep -v "No matches.")
TOMORROW=$(task ls due:tomorrow | grep -v "No matches.")

if [ -n "$TODAY" ]; then
  echo Mai teendők, évfordulók:
  echo $TODAY
fi
if [ -n "$TOMORROW" ]; then
  echo Holnapi teendők, évfordulók:
  echo $TODAY
fi

És ennek a szkriptnek a kimenetét küldenéd el email-ben magadnak. Sőt, akár azt is csinálhatod, hogy már maga ez a szkript küldi a mailt, az "echo" parancsok helyett egy változóba fűznéd, és a változó tartalmát egy mail paranccsal vagy valamivel elküldöd.
Ezt a szkriptet pedig berakod a crontab-ba, és örülsz :)

Egyébként én azt csinálom, hogy a .bashrc-ben benne van a task parancs, így mindig kiírja az aktuális dolgokat, teendőket, illetve ha a naptárra ráviszem az egérkurzort, egy tooltip-ben megjelenik az infó.

> Van valami ötlet hogy lehetne rávenni a shell -t, hogy átmenetileg NE értelmezgesse az argumentumokat?

man sh / bash / ksh - akármi, set parancs "-f" opció - kikapcsolja a globbingot, set +f pedig visszakapcsolja.

A csillag már-már megoldott, mire most látom más gond is van! A téma és a tartalom, hiába van időzőjellel vagy aposztroffal körülvéve, a szóközöknél szétbontja :(

* Én egy indián vagyok. Minden indián hazudik.

Nha, akkor hagyd a fenébe az eddigi sok marhaságot, és a

grep -v '^#' $1 | while read ROW

helyett legyen

grep -v '^#' $1 | while read ev ho nap ora perc email data

És akkor már csak a ${data} feldolgozásával kell megküzdeni, arra meg bármi jó csak a FS (field separator) állítgatásával kell kicsit matatni. Vagy ha rondán is megfelel akkor cut -d\" (és persze ha mindig van idézőjel a stringek körül).

Lehetne tömb is, pl:

grep -v '^#' $1 | while read -a ROW
do
  check_stamp "${ROW[@]}"
done

de ez sem segít a szóközök ellen, pl:

myecho -debug: 10 arguments:
   1: '*'
   2: '03'
   3: '07'
   4: '08'
   5: '*'
   6: 'tovis@localhost'
   7: '"Tamás'
   8: 'névnap"'
   9: '"Tamás'
  10: 'barátom"'

Annyi ötlet elhangzott, hogy érdemben nem írok semmit, csak azt, hogy egy ilyen kis parsert megírni nem túl bonyolult, Linuxon rengeteg eszköz van szövegfeldolgozásra. Adott esetben awk scriptben gondolkodnék.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Gyors kérdés: Thunderbird Lightning nem oldja meg tokkal-vonóval a problémád? Bár nem használtam még, de nekem úgy tűnik, lehet jegyzeteket tenni benne, s képes figyelmeztetni.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

ruby-ban library e celra:

rufus-scheduler gem

pl. https://github.com/jmettraux/rufus-scheduler

rufus-scheduler is a Ruby gem for scheduling pieces of code (jobs). It understands running a job AT a certain time, IN a certain time, EVERY x time or simply via a CRON statement.

Már-már azt mondanám kezd összeállni a dolog, nem is olyan szörnyen bonyolult:


#! /bin/sh
#
# Notify local user by mail using local MTA
#
#
NOW_YRS=`date +'%Y'`
NOW_MON=`date +'%m'`
NOW_DAY=`date +'%d'`
NOW_HRS=`date +'%H'`
/bin/echo -e "NOW:\t$NOW_YRS $NOW_MON $NOW_DAY $NOW_HRS\n"
#
ROW_COUNT=0
grep -v '^#' $1 | while read YRS MON DAY HRS ADDR SUBJECT TEXT
do
  ROW_COUNT=`expr $ROW_COUNT + 1`
  [ "$YRS" = "*" -o "$YRS" = $NOW_YRS ] || continue
  [ "$MON" = "*" -o "$MON" = $NOW_MON ] || continue
  [ "$DAY" = "*" -o "$DAY" = $NOW_DAY ] || continue
  [ "$HRS" = "*" ] && HRS=0
  [  $NOW_HRS -ge  $HRS ] || continue
  ####
  /bin/echo -e "$ROW_COUNT:\t$YRS $MON $DAY $HRS $ADDR $SUBJECT $TEXT"
  echo $TEXT | /usr/bin/mail -s $SUBJECT $ADDR
done

Még több bogarászó dolog is van benne.
Viszont nagyon furcsa amit a SUBJKET és a TEXT -el csinál, itt egy példa sor amit a szűrő áteresztett:
* 03 07 * tovis@localhost "Teszt üzenet" "Teszt üzenet szöveg"

A változók értéke:
A $SUBJECT = "Teszt
A $TEXT = üzenet" " Teszt üzenet szöveg"

Ilyet még nem láttam :( Ha valaki ilyet kérne nem tudom, hogy kellene ezt összehozni.

* Én egy indián vagyok. Minden indián hazudik.

Jajj, ez nagyon nem jó! Olyan változót ne olvass ki többször, amelynek egy értékére vagy kíváncsi, de az érték közben változhat. Például március 31-én éjfélkor kiolvasva simán március elsejét kaphatsz.

Vagy date +%s formát használj, s ezt a későbbiekben szintén date-tel konvertáld vissza - ez az érték viszont már nem mozog -, vagy tárold stringbe a date megfelelő formátumú kimenetét, amelyet szedj szét cut-tal:


datum=`date '+%-Y-%-m-%-d'`
ev=`cut -d- -f1 <<<"$datum"`
ho=`cut -d- -f2 <<<"$datum"`
nap=`cut -d- -f3 <<<"$datum"`

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Igazad is van, meg nem is. Ki fogom javítani, igérem!
Egyébként itt nem játszik, mivel szerintem 3-4 -szer fog lefutni naponta. Mivel veszkődtem eleget a dátum/idő stampekkel, a cronban soha nem állítok kerek órákat, a kedvencem az óra + 10 perc :)
Általánosságban azonban teljesen igazad van!

* Én egy indián vagyok. Minden indián hazudik.

Magyar nyelven is megjelent a Unix-bibliának számító Kernighan-Pike könyv. Címe:
Brian W. Kernigham - Rob Pike: A Unix operációs rendszer (Mûszaki könyvkiadó) Eredeti címe: The Unix programming environment.

Jelenleg is (1994 január) kapható Magyarországon, ára 800 forint körül van. Ha komolyan akarunk Unixal foglalkozni, akkor mindenképpen érdemes szert tennünk rá, mert hasznos és érdekes könyv, a hirdetéseket leszámítva mind a 350 oldala fontos dolgokat mond el a Unixról. Ez a legjobb magyar nyelven megjelent könyv a Unixról, amivel eddig találkoztunk.
(Orlando Unix iskola)

:)

Még egy rácsodálkozás :) Úgy 90-es évek lején Indiában vettem meg ezt a könyvet - azóta ott hever a polcon. Levettem (leporoltam), belenéztem, hát nem tudom, de ezt végig olvasni súlyos testi fenyítésnek számítana. Tipikusan olyan könyv amit át kell futni, megjegyezni mi is van benne leírva, majd ha kell előveszed és megnézed azt a konkrét dolgot ami éppen felmerült. Anno nem tettem ezt meg :(
Viszont ha valakinek kell találtam egy ilyet:
http://www.freebookzone.com/goto.php?bkcls=os_unx&bkidx=26&lkidx=1
Esetleg egy wget -el le is lehet tölteni.

* Én egy indián vagyok. Minden indián hazudik.

Indiaban vetted meg a magyar nyelvu UNIX-konyvet? Apam, informatikai hatalom lettunk!

(Megjegyzem, a velemenyem szerint ez pont az a konyv, amin nem atfutni kell, hanem alaposan elolvasni - ez persze hosszabb ido. Persze ezt csak annak erdemes igy, aki *X-szel komolyabban akar foglalkozni, mert akkor megterul a belefeccolt munka.)

:) Anno én teljesen kezdőként, nagyjából nulla tudással vettem meg és olvastam el úgy, hogy nem nagyon volt lehetőségem gyakorolni/próbálgatni a leírtakat - ne felejtsük el, hogy 1992-'93 táján jártunk (és ez már a 2. kiadása volt a könyvnek, az első, még szürke borítós, ha jól tudom 1987 körül jelent meg...).

Nem, természetesen angol nyelvű. Az első kiadás 1984 Prentice-Hall és amit megvettem az a hatodik indián újranyomtatás :)
Soha nem "olvastam ki" ilyen könyveket - forgattam - amikor megvettem még nekem sem volt mivel gyakorolni, próbálgatni, jó 10 év kellett mire *X -hez fértem, addigra meg elfelejtettem. Akkor a Kernighan név miatt vettem meg, hisz ez a név jegyzi a C programozók "Holy Bible" -ját, Ritchie -vel megosztva.

* Én egy indián vagyok. Minden indián hazudik.

Persze, és nem csak azt, hanem - ahogy ez ilyenkor el szok hangozni - nagyon indokolt eset kell ahhoz, hogy egy változófeloldás ne idézőjelek között történjen.

Az awk egyébként nem sokat segít, amikor igazi elemzésről van szó, és arról van, ha fel kell készülni az az idézőjelben escape-elt idézőjel esetére, ahol lehet, hogy a repjel nem is az idézőjelhez, hanem pl. egy másik repjelhez tartozik.
Ebben az elemzésben több érdemi logika lesz, mint szkript egyéb helyein összesen, ami inkább ujjgyakorlat.

Na ez már úgy tűnik, működik!


#! /bin/sh
#
# Notify local user by mail using local MTA
#
#
NOW_DATE=`date +'%Y %m %d %H'`
NOW_YRS=`echo $NOW_DATE | cut -b 1-4`
NOW_MON=`echo $NOW_DATE | cut -b 6-7`
NOW_DAY=`echo $NOW_DATE | cut -b 9-10`
NOW_HRS=`echo $NOW_DATE | cut -b 12-13`
# /bin/echo -e "NOW:\t-$NOW_YRS-$NOW_MON-$NOW_DAY-$NOW_HRS-"
###
ROW_COUNT=0
grep -v '^#' $1 | while read ROW
do
  ROW_COUNT=`expr $ROW_COUNT + 1`
  echo "$ROW_COUNT:\t$ROW"
  YRS=`echo "$ROW" | awk '{print $1}'`
  MON=`echo "$ROW" | awk '{print $2}'`
  DAY=`echo "$ROW" | awk '{print $3}'`
  HRS=`echo "$ROW" | awk '{print $4}'`
  ADDR=`echo "$ROW" | awk '{print $5}'`
  #SUBJECT=`echo "$ROW" | cut --delimiter='"' -f 2`
  #TEXT=`echo "$ROW" | cut --delimiter='"' -f 4`
  SUBJECT=`echo "$ROW" | awk 'BEGIN {FS="[\t\"]"} {print $2}'`
  TEXT=`echo "$ROW" | awk 'BEGIN {FS="[\t\"]"} {print $4}'`
  /bin/echo -e "$ROW_COUNT:\t-$YRS-$MON-$DAY-$HRS-$ADDR-$SUBJECT-$TEXT-"
  echo "$TEXT" | /usr/bin/mail -s "$SUBJECT" "$ADDR"
done

A SUBJECT és a TEXT kibontása, akár awk akár cut működik. Azt nem igazán értem, hogy miért nem 1 és 2 mező, hanem 2 és 4 es. Ha valaki tudja súgjon.
Mondjuk, ezzel az erővel akár a dátum időt is kivehetem cut segítségével, majd meglátom (gondolom a cut kevésbé erőforrás igényes mint az awk, másképp nincs jelentősége.
Kérlek fussátok át, hátha találtok még valami javítani valót.
Még van olyan hátsó gondolatom, hogy a TEXT mező lehetne (vagylagosan) fájl referencia is (azaz a szöveget ha hosszú lehetne egy másik fájlból venni) de már ez is nagyon jó lesz. Így utólag nem is olyan nehéz de jó sok időt elvitt.

* Én egy indián vagyok. Minden indián hazudik.

Nem egyszerűbb lenne a cut-ot így paraméterezni?


cut -d' ' -f1
cut -d' ' -f2
cut -d' ' -f3

stb. Amit írtál, abban az a kellemetlen, hogy merev pozíciókat vágsz ki, így nem működik akkor, ha a date-tel a vezető 0-kat nem íratod ki, s emiatt változhat a hónap, nap leírt hossza.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Mint azt láthatod, még az is gondot okoz, hogy a "field" hanyadik lesz? Ebbe már nem először futottam bele, de még nem találtam értelmes magyarázatot. Field -et ezért csak akkor használok ha muszáj, a field sorszámát "kipróbálásos" alapon kell kitalálnom ami azért nem mindig nyerő, hiszen nem értem miért épp annyi.
Egyébként azt hol tudnám beállítani, hogy ne írja ki a vezető nullákat?
Ennek már néhányszor neki futottam, pl. különösen zavaró, ha be kell állítani a dátum/időt - általában kérek egy "help" -et mert a fene emlékszik a pontos szekvenciára (amikor ilyet kell művelnem, általában valami gond van és amúgy is ideges vagyok). Így az USA angol(?) dátum/idő kijelzés eléggé zavaró - pont mint az önkiszolgálóban, amikor a lejárati dátumot próbálod kiolvasni.

* Én egy indián vagyok. Minden indián hazudik.

Az első delimitert megelőző rész az első mező, utána jön a delimiter, aztán a második mező, delimiter, a harmadik mező, s így tovább.

Azt érdemes tudni, hogy ha több delimiter jön közvetlenül egymás után, akkor ezek nem kerülnek összevonásra, hanem két ilyen delimiter között üres string lesz a field. Ebből az is jön, hogy ha delimiterrel kezdődik a sor, akkor az első mező üres string lesz. Nem kell próbálgatni. A date kimenetében meg tudod határozni a formátumot, ott pont kényelmesen jönnek ki a dolgok, sohasem lesz két delimiter egymás mellett, hacsak magaddal kiszúrásból nem generáltatsz vele olyan kimenetet.

A date kimenetében a vezető 0-k kioltása a '%' jelet követő '-' jel.

date +%m
03
date +%-m
3

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Bizisten nem értem mi a gondod a $2-vel és $4-gyel, ha egyszer tényleg ott vannak az értékek.
Mindegy.

Némi bashista gondolatébresztő:


parsethis() {
local ROW=$1
echo "DEBUG1: \$#=$#"
set -f
eval set $ROW
set +f
echo "DEBUG2: \$#=$#"
echo "\$1=<$1>, \$6=<$6>, \$7=<$7>"
}

while read ROW; do
parsethis "$ROW"
done < teszt.txt

Vagyis kikapcsolod a "globbing" -ot az értelmezéshez. Ki fogom próbálni, eddig ezt azért nem tettem, mert sosem olvastam végig a bash/dash manuált, így nem tudtam, hogy a "set" erre is alkalmas :)
A csillag problémát megoldja! Viszont, az idézőjelek közé írt szöveget nem tudja helyesen kezelni :(

* Én egy indián vagyok. Minden indián hazudik.

???

Pont azt a célt szolgálja az eval set, hogy a megfelelő részek kerüljenek a megfelelő pozícionális paraméterekbe:


$> cat teszt.txt
* 03 07 08 * tovis@localhost "Tamás névnap" "Tamás barátom"
$> cat x.sh
parsethis() {
local ROW=$1
echo "DEBUG1: \$#=$#"
set -f
eval set $ROW
set +f
echo "DEBUG2: \$#=$#"
echo "\$1=<$1>, \$6=<$6>, \$7=<$7> \$8=<$8>"
}

while read ROW; do
parsethis "$ROW"
done < teszt.txt
$> ./x.sh
DEBUG1: $#=1
DEBUG2: $#=8
$1=<*>, $6=<tovis@localhost>, $7=<Tamás névnap> $8=<Tamás barátom>
$>

Szia!

Ha jól értem a crontab buzergálása azért nem jó neked mert nem szeretnéd a mostanit összepiszkítani...
Miért nem hozol létre egy külön felhasználót, mondjuk "notice" néven, akit lezársz.
A figyelmeztetéseidet pakolhatnád ennek a felhasználónak a crontabjába.
A crontab fájl elejére rakd be a "MAILTO=emailcimem@enyimedomain.hu"-t, így még azzal sem kell foglalkoznod hogy miképp küldje el a levelet, igaz így a tárgy mezőre nem lesz ráhatásod, de talán ez nem is lényeg. A crontabbal futtatott parancs meg lehet egy egyszerű "echo A levél szövege"

-Mr-

Köszönöm a sok jó ötletet, tanácsot. A következő verziót elkezdtem tesztelni (ha valakit érdekel):


#! /bin/sh
#
# Notify local user by mail using local MTA
# ver 0.2.3
#
NOTIFY_LIST=$1
#####
set $(date +'%Y %m %d %H')
NOW_YRS=$1
NOW_MON=$2
NOW_DAY=$3
NOW_HRS=$4
echo "Check notificĂ­tion list at: $NOW_YRS $NOW_MON $NOW_DAY $NOW_HRS\n"
####
ROW_COUNT=0
grep -v '^#' $NOTIFY_LIST | while read ROW
do
  ROW_COUNT=`expr $ROW_COUNT + 1`
  /bin/echo -e "IN  $ROW_COUNT:\t$ROW"
  ####
  YRS=`echo "$ROW" | cut --delimiter=' ' -f 1`
  MON=`echo "$ROW" | cut --delimiter=' ' -f 2`
  DAY=`echo "$ROW" | cut --delimiter=' ' -f 3`
  HRS=`echo "$ROW" | cut --delimiter=' ' -f 4`
  MTO=`echo "$ROW" | cut --delimiter=' ' -f 5`
  SBJ=`echo "$ROW" | cut --delimiter='"' -f 2`
  TXT=`echo "$ROW" | cut --delimiter='"' -f 4`
  [ "$YRS" = "*" -o "$YRS" = $NOW_YRS ] || continue
  [ "$MON" = "*" -o "$MON" = $NOW_MON ] || continue
  [ "$DAY" = "*" -o "$DAY" = $NOW_DAY ] || continue
  [ "$HRS" = "*" ] && HRS=0
  [  $NOW_HRS -ge  $HRS ] || continue
  ####
  /bin/echo -e "OUT $ROW_COUNT:\t-$YRS-$MON-$DAY-$HRS-$MTO-$SBJ-$TXT-\n"
  ####
  echo "$TXT" | /usr/bin/mail -s "$SBJ" "$MTO"
done 

Eddig jól viselkedik, azt csinálja amit kell.

* Én egy indián vagyok. Minden indián hazudik.

A szövegekben nem terveztem nagyon komoly tartalmat. Távlati tervekben olyan szerepel, hogy a mező egy hivatkozás lehet valami fájlra, de egyenlőre már evvel is rém boldog vagyok :D

Megjegyzés: A házi szerveremen jelenleg FAX vétel is van, az mgetty segítségével, amihez egy "new_fax" scriptum is van, nem szeretném ennyire megbonyolítani a dolgot. Semmi csicsa, működjön, jelezze amire emlékeztetni akartam magamat!

* Én egy indián vagyok. Minden indián hazudik.

Persze, van egy bizonyos szint, ami fölött nem biztos, hogy érdemes szépészkedni. Egyszer néztem az Ubuntu Grub2 splash screen scriptjét, az érdemi teendő két sor volt benne, a többi, nagyjából a script 98 %-a pedig hibakezelés, a legvadabb dolgokra való felkészülés volt.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE