• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Einstiegsfragen Shell Skripte

canahan

Newbie
Hallo zusammen,

da ich programiertechnisch Laie bin und nun meine ersten zaghaften Versuche auf der Shell unternehme, wollte ich mal fragen ob ich generell auf dem richtigen weg bin :). Ich hab hier ein kleines Skript zum ablgleich mit ein paar ntp server geschrieben. Funktioniert soweit auch, nur würde mich interessieren wie man sowas sauberer schreiben könnte. Vielleicht hat jemand nerv sich das mal anzutun :)

Code:
/usr/sbin/ntpdate -u time.uni-freiburg.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (1Freiburg)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
 exit 0
fi
/usr/sbin/ntpdate -u ntp0.fau.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (2Frauenhofer)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
exit 0
fi
/usr/sbin/ntpdate -u ntps1-0.cs.tu-berlin.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (3Berlin)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
exit 0
fi
/usr/sbin/ntpdate -u ptbtime1.ptb.de > /dev/null 2>&1
if [ $? = 0 ] ; then
 /sbin/hwclock --systohc
 echo "Die Systemzeit wurde erfolgreich gesetzt (4ptbtime1)"
 logger TIME: Die Systemzeit wurde erfolgreich gesetzt
exit 0
fi
 echo "Leider war keiner der Timeserver verfuegbar"
 echo "Die Systemzeit konnte nicht gesetzt werden !!!"
 logger TIME: Keine externe Zeitserver verfuegbar
 logger TIME: Die Systemzeit konnte nicht gesetzt werden
exit 1
fi
 

TeXpert

Guru
Was mich persönlich an so einem Stil stört:

1/ viele gleiche Strukturen --> mach eine Funktion draus

2/ viele gleiche Exits -> das führt schnell zu verwirrungen, versuche das erfolgreiche Beenden eines Scripts an einer stelle zubündeln

3/ Variablen :) alles was irgendwie konfigurierbar ist, rausziehen (hier z.B. die Liste der NTPServer, das macht das Script wartungsfreundlicher

4/ einen kleinen Root-Check. Das Scritp setzt root Rechte vorraus, hier ist ein kleiner Check nett um nicht auf andere Fehler zu laufen

aber an sich liest sich das Dingen gut, ich würde das spontan (ohne Test und doppelten Boden, d.h. mit potentiellen Fehlern und ohne garantie auf 'besseren' code) so ändern, den ganzen success kram könnte man weglassen, da ja alle infos im logfile auftauchen
Code:
#!/bin/bash

NTPSERVERS="time.uni-freiburg.de ntp0.fau.de ntps1-0.cs.tu-berlin.de"
SUCCESS=0

if [ ! `id -u` = 0 ]
then
  echo "you must be root :)"
  exit 1
fi 

# function:
ntpsync() {
  SERVER=$1
  /usr/sbin/ntpdate -u $SERVER > /dev/null 2>&1
  if [ $? = 0 ]
  then
     /sbin/hwclock --systohc
     return 0 
  fi
  return 1
}


# main loop
for NTPS in $NTPSERVERS
do
   ntpsync $NTPS
   if [  $? = 0 ]
   then
     echo "Die Systemzeit wurde erfolgreich gesetzt ($NTPS)"
     logger TIME: Die Systemzeit wurde erfolgreich gesetzt
     SUCCESS=1
     break
   else 
     logger "TIME: Server $NTPS nicht verfügbar"
   fi
done

if [ $SUCCESS = 0 ]
then
 echo "Leider war keiner der Timeserver verfuegbar"
 echo "Die Systemzeit konnte nicht gesetzt werden !!!"
 logger TIME: Keine externe Zeitserver verfuegbar
 logger TIME: Die Systemzeit konnte nicht gesetzt werden
 exit 1
fi

die NTP-Server würde ich dann sinnvollerweise auslagern, extern speichern oder übergeben, dann ist das noch wartungsfreundlicher
 
OP
C

canahan

Newbie
Vielen Dank für die Antwort. Werde mich heute abend mal hinsetzen und versuchen es in deinem Stil neu aufzusetzen. Kam mir von Anfang an komisch vor das sich gleiche Teile ständig wiederholen.

Für weitere Vorschläge bin ich dankbar :)
 

regexer

Advanced Hacker
Weitere Vorschläge von meiner Seite sind:
1) Anhand der Systemvarialbe $? prüfen, ob der Befehl "hwclock" richtig ausgeführt wurde.
2) Falls das Skript noch sicherer gemacht werden soll:
a) Anhand $? prüfen, ob der Befehler "logger" richtig ausgeführt wurde.
b) mit dem Systemkommando "trap" verschiedenste Signale abhandeln. Wass soll z.B. passieren, wenn das Script während der Ausführung Signal 2 bekommt (Entspricht Strg+C)?
 
Oben