Erinnerung mit Winpopup

Linuxneuling

Linuxneuling

Tripel-As
Moin, ich hab ein kleines Script geschrieben, der die Benutzer an Bänder einlegen erinnert.

Code:
#!/bin/bash
# 
#
#Script, der die User an Baender einlegen erinnert!
#

LOGFILE=/home/noe/band$(date +%d%m%y)

mt tell
if [ $? -eq "2"]
        then

        ping -q -W 5 -c 3 administrator >/dev/null
        else echo " Keiner anwesend, der das Band einlegen koennte " >> $LOGFILE
                if [ $? ]
                then
        echo " Automatische Erinnerung:

 Bitte Baender einlegen.

 Danke! " | smbclient -M administrator
                else

                ping -q -W 5 -c 3 ws003 >/dev/null

                        if [ $? ]
                        then
        echo " Automatische Erinnerung:

 Bitte Baender einlegen.

 Danke! " | smbclient -M ws003
                else
                        ping -q -W 5 -c 3 ws004 >/dev/null

                                if [ $? ]
                                then
        echo " Automatische Erinnerung:

 Bitte Baender einlegen.

 Danke! " | smbclient -M ws004
                                else
                                echo "Alle PCs ueberprueft" >> $LOGFILE

                fi
                fi
                fi
                fi
Nach dem ausführen des Scriptes bekomme ich folgende Meldung:
Code:
sh erinnerung
mt: /dev/tape: Input/output error
erinnerung: line 11: [: missing `]'
WARNING: The "printer admin" option is deprecated
Connected. Type your message, ending it with a Control-D
sent 68 bytes

Kann mir jemand sagen, was die folgende Zeile bedeutet: erinnerung: line 11: [: missing `]' bzw. die Warnung?
Merkwürdig ist auch, dass das Skript nicht IMMER eine Nachricht sendet, wenn ich das Skript als normaler User ausführe... Kann mir jemand sagen, warum das so ist?
Mit Shellprogrammierung habe ich nicht viel zu tun gehabt ;)
 
Vor die abschliessende eckige Klammer in Zeile 11 muss ein Leerzeichen:
Code:
if [ $? -eq "2" ]
 
Danke!

Jetzt habe ich eine Frage, warum das Skript gleich abbricht, wenn der erste Rechner offline ist? Ich hab deshalb die if schleifen verschachtelt, damit die Nachricht an den nächsten Rechner gesendet wird, wenn der eine offline ist? Der erste Rechner der online ist bekommt die Nachricht, der zweite nicht, wenn der erste online ist... Was hab ich falsch programmiert?
 
Hallo,

vermutlich, weil nach dem ersten ping sofort die else echo ... zeile kommt
und danach erst der error code [ $?] des echo Befehls (und nicht des ping) abgefragt wird.

hmh
 
Danke für deine Hilfe!

Leider funktioniert es noch immer nicht, ich hab die Zeile else echo rausgenommen... würde auch ohne die Zeile auskommen, jedoch weiss ich nicht wie if drauf reagiert... das skript bleibt immer noch an der gleichen stelle stehen... dass keine verbindung zum ersten Rechner hergestellt werden kann...

Kann mir jemand sagen, wo ich den else für die erste if schleife eingeben kann?
 
Erstmal würde ich Dir raten, Deine Programme übersichtlicher zu schreiben. Wenn ich Dich richtig verstehe, willst Du ins Logfile schreiben, wenn Du keinen Rechner erreichen kannst. Eine (von vielen) Lösungen wäre, eine Hilfsvariable zu benutzen, wie folgt:

Code:
if [test Bandlaufwerk]
then
  reached=0

  ping xxx
  if [ $? ]
  then
    echo "Band einlegen..."
    reached=1
  fi

  ping yyy
  if [ $? ]
  then
    schreibe "Band einlegen..."
    reached=1
  fi
  ...
  if [ $reached -eq 0 ]
  then
    schreibe log
  fi
fi
 
Zuletzt bearbeitet:
Hallo Phorus!

Danke für dein gutes Beispiel! Mit dem Skript wollte ich erreichen, dass die Kollegen und ich erinnert werden, wenn zur einem bestimmten Zeitpunkt kein Band eingelegt ist! Mir ist alles bis auf reached kar... ich gehe davon aus, dass reached die rückgabewert ist wie eq... Morgen werde ich es testen...
 
reached ist eine Hilfsvariable, sie hat nix mit dem System zu tun. Am Anfang initialisierst Du sie mit einem (freigewählten) Wert 0. Man kann sie auch mit dem String "No" oder "gixgax" initialisieren, was völlig egal ist, weil nur Du sie benutzt. Sobald irgendein Rechner erreicht wird, setzt Du sie auf einen anderen Wert, also hier 1, oder "Yes" ....

Zum Schluss wertest Du die Variable aus. Wenn sie noch "jungfräulich" ist, also den Startwert hat, bedeutet das, dass sie nie in einer "Computer erreicht"-Umgebung geändert wurde -> ergo kein Computer erreicht.

edit: ps: Im Grunde genommen, kann man reached als Rückgabewert interpretieren.
 
Zuletzt bearbeitet:
Hallo Phorus,

ich glaube da liegt eine Missverständis vor. Sorry, wegen unübersichtlichen Skript, den ich gepostet habe...

Code:
LOG=/home/noe/band$(date +%d%m%y)
#Zuerst soll überprüft werden, ob das Band im Laufwerk eingelegt ist...
mt tell
if [ $? -eq 2 ]
#Wenn nein, dann bekomme ich eine Wert 2 und es sollte eine Erinnerung  an #einen von die 3 PC´s geschickt werden, einfach den ersten, der online ist...
then
# wenn PC administrator online ist, sollte eine Erinnerung geschickt werden und somit hat es sich erledigt..
        ping -q -W 5 -c 3 administrator >/dev/null
  else echo " Band ist eingelegt " >> $LOG
  if [ $? ]
  then
    echo "Automatische Erinnerung:
Bitte Band einlegen!
Danke!"
  fi
  else
# Wenn der PC administrator nicht online war, soll das Skript einfach den nächsten Rechner überprüfen...
        ping -q -W 5 -c 3 ws003 >/dev/null
  if [ $? ]
  then
    echo "Automatische Erinnerung:
Bitte Band einlegen!
Danke!"

  fi
  else
        ping -q -W 5 -c 3 ws004 >/dev/null
  if [ $? ]
  then
   echo "Automatische Erinnerung:
Bitte Band einlegen!
Danke"
  fi
  else
        echo "Kein PC online" >> $LOG
fi
Irgendwie interpretiere ich die Skriptsprache nicht richtig... Besonders mit else habe ich im Moment ein Problem. Sorry, da ich das mit reached weg gelassen habe, ich hatte das schon versucht und dies weggenommen, weil ich noch nicht genau wusste was dies macht... Jetzt werde ich weiterversuchen... Kann ich das alles mit if realisieren oder muss ich das mit einer while schleife machen?
 
das geht schon mit if , du brauchst keine while schleife. aber deine syntax ist falsch. ein if schaut so aus
Code:
if (( $?==0 ))
then
  echo "gut"
else
  echo "nix"
fi
du hingegen machst immer ein
Code:
if
then
...
fi
else
...
das heisst du machst die if abfrage schon vor dem else zweig mit fi zu, das kann nicht funktionieren.

ps: bei deiner source code formatierung ist schwer erkennbar was du überhaupt vorhast.
 
danke, ich hab schon bemerkt, dass ich if irgendwie falsch verschachtelt habe...
irgendwie kriege ich das nicht hin, weil das Beispiel das Phorus geschrieben hat ist egal, ob das Band eingelegt ist und schickt die nachricht an allen rechner, die ich eingetragen habe...

Ich möchte gerne ein Skript, das überprüft ob das Band ein gelegt ist, wenn ja, dann braucht das Skript nichts mehr machen... wenn nicht, dann soll es den nächsten Rechner der online ist eine Nachricht schicken, aber nicht an alle 3 gleichzeitig... ich glaube, dass das mit if nicht funktionieren kann, oder?
 
das geht schon. du musst nur die if's ineinander verschachteln. um bei phorus' beispiel zu bleiben:
Code:
if [test Bandlaufwerk]
then
  reached=0

  ping xxx
  if [ $? ]
  then
    echo "Band einlegen..."
    reached=1
  else
    ping yyy
    if [ $? ]
    then
      schreibe "Band einlegen..."
      reached=1
    fi
  fi
  ...
  if [ $reached -eq 0 ]
  then
    schreibe log
  fi
fi
 
Danke an allen! :) Wieder was dazugelernt... jetzt klappt es!
 

Ähnliche Themen

Switche abfragen über Script

NAS-Drive Mount in Bash-Script über crontab

Verschlüsseltes Backup-Script mit rsync

HandbrakeCLI Shell Skript

Crontab und Scripts - Problem

Zurück
Oben