[Bash] Script if-Schleifen in for-Schleife einbauen

  • Ersteller Ersteller =DarkEagle=
  • Erstellt am Erstellt am
D

=DarkEagle=

Gast
[Bash] Script if-Konstrukte in for-Schleife einbauen

Hallo zusammen,
ich arbeite hier gerade an einem Bashscript. Es gibt VARIABLE1 und VARIABLE2, die Werte enthalten, die vorher aus dem System ausgelesen wurden.
Danach sollen die Variablenwerte überprüft und anschließend ein entsprechender STatus der Statusvariable zugeordnet werden.
Dafür habe ich 2 if-Konstrukte gebaut. Es funktioniert dann auch alles soweit. Wie kann ich aus diesen 2 if-Konstrukten ggf.
eine for-SChleife bauen? Normal for-Schleife ist kein Problem, aber ich habe hier verschiedene Variablen, wo ich nun nicht
weiß, wie ich das vereinfachen kann. Jmd ne Idee?

Code:
       if ( [ "$VARIABLE1" -ge "$w" ] && [ "$VARIABLE1" -lt "$c" ] )
                then
                        VARIABLE1STATUS=Warning
                elif [ "$VARIABLE1" -ge "$c" ]
                        then
                                VARIABLE1STATUS=Critical
                elif [ "$VARIABLE1" -lt "$w" ]
                        then
                                VARIABLE1STATUS=OK
                else
                        VARIABLE1STATUS=Unknown
fi
        if ( [ "$VARIABLE2" -ge "$w" ] && [ "$VARIABLE2" -lt "$c" ] )
                then
                        VARIABLE2STATUS=Warning
                elif [ "$VARIABLE2" -ge "$c" ]
                        then
                                VARIABLE2STATUS=Critical
                elif [ "$VARIABLE2" -lt "$w" ]
                        then
                                VARIABLE2STATUS=OK
                else
                        VARIABLE2STATUS=Unknown
fi
 
Zuletzt bearbeitet:
Ich habe es einmal verallgemeinert und als Konstrukt bezeichnet ;-)
 
Eine for Schleife macht man, wenn man abzählen kann wie oft die Schleife läuft
kannst du das?
Ja => sollte klar sein wie der schleifenkopf aussieht
nein => while Schleife
 
Sneazel schrieb:
Eine for Schleife macht man, wenn man abzählen kann wie oft die Schleife läuft
kannst du das?
Ja => sollte klar sein wie der schleifenkopf aussieht
nein => while Schleife
Stimmt nicht ganz.

Aber egal... Das Problem ist, dass er verschiedene Variablen in den Konstrukten benutzt, die er verkürzen will.
Lösung wäre ein Array anstatt der Variablen.
 
Zuletzt bearbeitet:
Sneazel schrieb:
Eine for Schleife macht man, wenn man abzählen kann wie oft die Schleife läuft
kannst du das?
Ja => sollte klar sein wie der schleifenkopf aussieht
nein => while Schleife

Kann ich. Schleifenkopf ist auch nicht unbedingt das Problem. Eher das ganze Konstrukt, da ich halt nicht nur eine einfache Variable habe.
Whileschleife bringt mir hier auch nichts anderes.
Demon0no schrieb:
Stimmt nicht ganz.

Aber egal... Das Problem ist, dass er verschiedene Variablen in den Konstrukten benutzt, die er verkürzen will.
Lösung wäre ein Array anstatt der Variablen.

Richtig erkannt. Ich habe mehrere Variablen, die ich verkürzen will, weshalb es mir nicht reicht.

Schleifenkopf dürfte for $Z in "VARIABLE1" "VARIABLE2" sein. Nun muss ich nochmal schauen, ob ich Variablennamen kombinierne kann. Ansonsten mache ich ein Array.
 
Wie wäre es, wenn Du sich wiederholende Vorgänge als eigenen Funktionsblock deklarierst, dann sparst Du Dir unnötige Wiederholungen.
etwa:
Code:
f_test()
  if ( [ "$1" -ge "$w" ] && [ "$1" -lt "$c" ] ); then
    eval ${1}STATUS=Warning
  elif [ "$1" -ge "$c" ]; then
    eval ${1]STATUS=Critical
  elif [ "$1" -lt "$w" ]; then
    eval ${1}STATUS=OK
  else
    eval ${1}STATUS=Unknown
  fi
}

for I in $VARIABLE1 $VARIABLE2; do
  f_test ${I}
done

(nicht getestet, könnte Fehler enthalten)

edit: enthielt sogar copy&paste Fehler. Ich brauche eindeutig mehr Kaffee.
Bedenke, daß 'eval ${1}STATUS=X' den Wert der Variablen einsetzt, wenn also $1=250, dann ist die neue Variable '250STATUS', was natürlich eine Fehlermeldung zur Folge hat, da Variablen nicht mit Nummern beginnen sollten.
 
Zuletzt bearbeitet:
Twostone schrieb:
Wie wäre es, wenn Du sich wiederholende Vorgänge als eigenen Funktionsblock deklarierst, dann sparst Du Dir unnötige Wiederholungen.
etwa:
Code:
f_test()
  if ( [ "$1" -ge "$w" ] && [ "$1" -lt "$c" ] ); then
    eval ${1}STATUS=Warning
  elif [ "$VARIABLE1" -ge "$c" ];                        then
    eval ${1]STATUS=Critical
  elif [ "$VARIABLE1" -lt "$w" ];                        then
    eval ${1}STATUS=OK
  else
    eval ${1}STATUS=Unknown
  fi
}

for I in $VARIABLE1 $VARIABLE2; do
  f_test ${I}
done

(nicht getestet, könnte Fehler enthalten)


Funktionsblock ist im Prinzip sogar noch angenehmer. Gute Idee!
 
Ganz so sauber ist diese Lösung dann doch nicht, da ich mal wieder gewisse Dinge vergessen habe (siehe Anmerkungen zum edit des letzten Posts). Sinnvoll wäre es sicherlich, mit Arrays zu arbeiten, die nicht nur Werte, sondern auch Bezeichnungen enthalten. also in etwa VARIABLE=('KAFFEE' '32°C'). So könntest Du dann mit 'eval ${VARIABLE[0]}STATUS' die Variable "KAFFEESTATUS" bilden, und Dir mit 'echo ${VARIABLE[1]}' die Temperatur anzeigen lassen.
 
AW: [Bash] Script if-Konstrukte in for-Schleife einbauen

Storm88? Srsly? Der Nick war doch jetzt kein Versehen, oder? Ich meine, das fällt einem doch auf, was man da ins Registrierungsfeld schreibt. :/
 
Baust du für nagios ein nrpe-script? Sieht auf jedenfall sehr danach aus =)
Wenn ja könntest du das auch so verkürzen:
Code:
ex=3 # UNKNOWN
for V in $VARIABLE1 $VARIABLE2; do
  [ "$V" -ge "$c" ] && ex=2 # CRITICAL
  [ "$V" -lt "$c" -a "$ex" -lt 2 ] && ex=1 # WARNING
  [ "$V" -lt "$w" -a "$ex" -lt 1 ] && ex=0 # OK
done
exit $ex

Das prüfen ob du zwischen critical und warning bist kannst du dir eigentlich sparen:
Alles was kleiner als critical ist wird zu warning, wenn etwas kleiner als warning ist (warning ist ja immer kleiner critical) dann kann das eh nochmal von ok überschrieben werden.
 
Zuletzt bearbeitet:
Zurück
Oben