crond als Shellskript

K

kmh

Grünschnabel
Ich habe ein Shellskript gefunden, das "crond" emuliert.

Code:
#!/bin/sh

# crond replacement

CRONTAB=/var/etc/crontab
# crontab format
# +---------minute         00-59
# | +-------hour           00-23
# | | +-----day of month   01-31
# | | | +---month          01-12 
# | | | | +-day of week    1-7 
# | | | | |                                                              
# * * * * * command

while true
do
  remain=$(date +%S|sed 's/^0//')
  sleep $((60-remain))
  set $(date '+%M %H %d %m %w')
  while read minute hour day month wday command
  do
    runit=""
    if [ "${minute###}" != "$minute" ] 
    then
      continue
    fi 
    [ "$minute" = "$1" ] || [ "$minute" = "*" ] && runit=$runit"M"
    [ "$hour" = "$2" ] || [ "$hour" = "*" ] && runit=$runit"H"
    [ "$day" = "$3" ] || [ "$day" = "*" ] && runit=$runit"d"
    [ "$month" = "$4" ] || [ "$month" = "*" ] && runit=$runit"m"
    [ "$wday" = "$5" ] || [ "$wday" = "*" ] && runit=$runit"w"
    if [ "$runit" = "MHdmw" ]
    then
      log="/tmp/log-$(date +%Y%m%d)"
      echo "$(date) running $command" >> $log
      $command >>$log 2>&1 &
    fi 
  done < $CRONTAB
done

Der Punkt, indem ich beim Verständnis nicht weiterkomme, ist folgende Passage:

Code:
    if [ "${minute###}" != "$minute" ] 
    then
      continue
    fi

Vor allem die Variable minute### ist mir suspekt ??
Ich würde mich sehr freuen wenn mir das jemand erklären könnte - bin leider noch kein Skript-Profi.
 
Code:
if [ "${minute###}" != "$minute" ]
Ein bzw. zwei Doppelkreuze sind Modifizierer fuer Bash. Es interpretiert die nachfolgenden Zeichen als regulaeren Ausdruck ('pattern') und entfernt das laengstmoegliche Muster, das mit '$minute' ab Beginn uebereinstimmt.

In diesem Fall ueberprueft es, ob '$minute' selber mit einem Doppelkreuz beginnt und entfernt ihn dann. Falls also der Pruefausdruck mit einem Doppelkreuz beginnt, so wird die Zeile als Kommentar interpretiert und uebersrpungen. Man haette auch schreiben koennen
Code:
if [ "${minute#'#'}" != "$minute" ]
Dann waere wohl deutlicher geworden, dass das erste Kreuz ein Operator ist und das zweite ein Operand. Ohne die einf. Anfuehrungszeichen werden beide Kreuz als ein Operand interpretiert.

S. a. 'info bash' mit Suche nach '##'
 
Danke für die Erklärung - jetzt verstehe ich es.
(Ich habe auch noch in 'info bash' nachgelesen, da steht es auch nochmal schön beschrieben.)
:))
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

script sshpass

Crontab und Scripts - Problem

[Erledigt] Shell-Skript lässt sich nicht mit Cron ausführen

[gelöst] - for file in ... nur für bestimmte Endungen?

Zurück
Oben