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

[geloest] Script Problem

Hallo

Vielleicht kann mir jemand sagen wiso das hier nicht geht

Code:
var1="/usr/sbin/rcclamd status"
var2="/usr/bin/grep -o running"
$var1 | $var2 #ausgabe an dieser Stelle ist "running" die Ausgabe wenn clamd gestartet ist, ist ja korrekt so

if $var1 | $var2 = running  #hier funktioniert das nicht, auch nicht mit " oder '
   echo laeuft
else
   echo laeuft nicht
fi

Ich habs mittlerweile über den Rückgabewert in den Griff gegriegt.
Mich interessiert aber wiso dieses Script nicht geht.


cu Huflatisch
 

abgdf

Guru
Die Konstruktion heißt
Code:
if test ....
then
    echo ....
else
    echo ....
fi
Bitte lies auch "man test" dazu, wie die Bedingungen formuliert werden müssen.

Gruß
 

Tooltime

Advanced Hacker
Huflatisch schrieb:
Vielleicht kann mir jemand sagen wiso das hier nicht geht
Weil nichts funktioniert bis auf die Kommentare in deinem Script.

Huflatisch schrieb:
var1="/usr/sbin/rcclamd status"
Starte den Befehl mal direkt in einer Shell und dann echo $var1. Wenn der Rückgabewert in die Variable geschrieben werden soll, muss anders gequotet werden.
Huflatisch schrieb:
var2="/usr/bin/grep -o running"
Selbst wenn die Shell-Variable als Befehl ausgeführt wird, wer soll den da gegrept werden?
Huflatisch schrieb:
In einer Shell ist das |-Zeichen eine Pipe und keine Oderverknüpfung.

Die if-Anweisung fragt nur den Returncode des letzten ausgeführten Befehl ab. Wie der Kollege schon richtig bemerkt hat, muss man Variablen mit dem test-Befehl auswerten. Eine alternative Schreibweise für den Befehl test, die man häufig sieht, sind die eckigen Klammern.

Da hilft nur eine Anleitung für die Grundlagen der Shell-Programmierung.
 
OP
H

Huflatisch

Hacker
Hey
so wie hier isses ja richtig
Code:
Zeus:~ # /sbin/rcpostfix status |/usr/bin/grep -o running
running

...aber hier als Variable gehts nicht ... mhhh
Code:
Zeus:~ # var1="/sbin/rcpostfix status |/usr/bin/grep -o running"
Zeus:~ # echo $var1
/sbin/rcpostfix status |/usr/bin/grep -o running

Zeus:~ # $var1
Checking for service Postfix:                                         running
Zeus:~ #

deshalb funktioniert auch das Script nicht ... sollte aber nach meinem Verständniss, falls in der Variable "running" stehen tät
Code:
var1="/sbin/rcpostfix status |/usr/bin/grep -o running"

if test $var1  = running
then
   echo laeuft
else
   echo laeuft nicht
fi


cu
Huflatisch

PS: dieses Script funktioniert ... aber mich interessiert wiso das vorhergehende nicht geht

Code:
/usr/sbin/rcclamd status > list
/usr/bin/grep running list
if test "$?" = 0
then
        echo laeuft
else
        /usr/sbin/rcclamd restart
fi
 
A

Anonymous

Gast
Huflatisch schrieb:
... aber mich interessiert wiso das vorhergehende nicht geht
ist doch ganz einfach, denk dich doch mal in die Lage der bash und zerlege die "if test-Zeile" zur Runtime
Code:
var1="/sbin/rcpostfix status |/usr/bin/grep -o running"
if test $var1  = running
Daraus wird dann dort zur Laufzeit
Code:
if test /sbin/rcpostfix status |/usr/bin/grep -o running = running
Das kann nicht funktionieren.

Übrigens Vorsicht mit solchen Konstrukten. Wenn du hier einen anderen Status als "running" hast, ist die Variable leer und damit geht bei einigen Scriptaufbauten in diesem Thread das ganze Script in die Hose, anstatt in den "else-Zeig" zu verzweigen.

robi
 
OP
H

Huflatisch

Hacker
Hey

Daraus wird dann dort zur Laufzeit
Code: Alles auswählen
if test /sbin/rcpostfix status |/usr/bin/grep -o running = running

Das kann nicht funktionieren.

ja ist schon klar (warum wird der Befehl nicht ausgeführt) aber die bash interpretiert ja gleiche variablen bzw. Variablenverknüpfungen immer mal anders
Beispiel
Code:
var1="/usr/sbin/rcclamd status"
var2="/usr/bin/grep -o running"
$var1 | $var2
Ausgabe "running" #so will ich die ausgabe

Code:
var1="/usr/sbin/rcclamd status"
var2="/usr/bin/grep -o running"
echo "$var1 | $var2"
Ausgabe "/usr/sbin/rcclamd status | /usr/bin/grep -o running" # ist klar

Code:
var1="/usr/sbin/rcclamd status |/usr/bin/grep -o running"
$var1
Ausgabe "Checking for Clam AntiVirus daemon ...running" # wiso grept der nicht das pipe ist doch richtig

Code:
var1="/usr/sbin/rcclamd status |/usr/bin/grep -o running"
echo "$var1"
Ausgabe "/usr/sbin/rcclamd status |/usr/bin/grep -o running" # ist klar

Code:
var1="/usr/sbin/rcclamd status"
var2="/usr/bin/grep -o running"
$var1 | $var2
if test "$var1 | $var2" = running
then
   echo laeuft
else
   echo lauft nicht
fi
wie muss ich denn die var im Test setzen das die Ausgabe stimmt


cu Huflatisch
 
OP
H

Huflatisch

Hacker
Tooltime schrieb:
Wie schon erwähnt, alles eine Frage des quoten. Aus
Huflatisch schrieb:
var1="/sbin/rcpostfix status |/usr/bin/grep -o running"
werde
var1=`/sbin/rcpostfix status |/usr/bin/grep -o running`

hier scheint die Lösung zu stehen (muss bloß noch ne leere Ausgabe abfangen) ..... wie heißt denn das Zeichen überhaupt

Danke

cu
Huflatisch
 
A

Anonymous

Gast
versuch mal das hier
Code:
#! /bin/bash
RC="rcsshd"

STATUS=$($RC status 2>/dev/null | tail -1 | awk -F. '{print $NF}')
case "$STATUS" in
  (done)   echo "Dienst beendet"
          ;;
  (running) echo "Dienst läuft" 
          ;;
  (failed) echo "Dienst fehlerhaft" 
          ;;
  (missing) echo "Dienst unbekannt"
          ;;
  (skipped) echo "Dienst übersprungen"
          ;;
  (dead) echo "Dienst beendet"
          ;;
  (unused) echo "Dienst nicht benutzt"
          ;;
  (unknown) echo "Dienst nicht gestartet"
          ;;
  (*)  echo "Abfrage ohne gültigen Status"
esac
in der 2. Zeile das richtige Script angeben, und dann kannst du unten an der entsprechenden Stelle (jeweils vor dem ;;) noch deine Aktionen einfügen die du benötigst oder auführen willst.

robi
 
OP
H

Huflatisch

Hacker
Hey

Danke für die Infos
Ich hatte mir das Script schon so ähnlich zusammengebastelt. Werds aber mit deinen noch bissel optimieren :D

cu
Huflatisch
 
Oben