IF OR befehl

Wir haben aktuell ein Problem mit dem Board und arbeiten an der Lösung...
  • Hallo Zusammen


    Ich will in einem shell Script folgendes machen


    Code
    IF [ grep -qs Name1 /etc/hostname ] || [ grep -qs Name2 /etc/hostname ] ; then 
    echo "test"
    else 
    echo "nichts"
    fi


    funktioniert einfach nicht.
    Kann jemand helfen ich will bei der DreamBoxen mit dem Hostname Name1 oder Name2 einen befehl laufen lassen sollte ein anderer Name im Hostname File sein tue was im else ist.
    Ich versuche seit stunden und kenne alle Fehlermeldungen langsam... :kaffee:

  • Hi ezo


    Ich schreibe meine or Befehle im Script immer mit -o.


    Beispiel:

    Code
    if [ $debug = 0 -o $anfang = 0 ] ; then
        blablablabla
      fi


    Das soll aber nicht heissen das das mit den beiden Strichen nicht funktioniert (ich kenne mich da auch nicht so gut mit aus).


    Vielleicht hilft dir das ja weiter...


    Gruß Axel

    Ich übernehme keine Haftung für Schäden oder Frustration und anderes die durch meine Beiträge und Scripte bzw. Tools entstehen.

  • Die eckige Klammer [ ist ein Synonym für den Befehl "test", und die eckige Klammer ] ist ein Dummy, das nur aus Symmetriegründen benutzt wird. Es ist also keineswegs so, dass die diese Klammern zur Priorisierung eines Teilausdruckes dienen.


    Das :tired_face: wiederum dient als nachgeschaltetes "falls false". Es es das Pendant zum &&. Man kann dies z.B. mit den Sequenzen
    true && echo "ist true"
    false :tired_face: echo "ist false"
    testen, was abkürzende Schreibungen von
    if true; then echo "ist true"; fi
    if ! false; then echo "ist false"; fi
    sind. Es sind also Implikationen und nicht OR bzw. AND. Wie axelgpunkt bereits schrieb, sind -o und -a für OR bzw. AND zu benutzen.

  • Danke Jungs ich habs so gelöst und funktioniert wunderbar...


  • Wenn es funktioniert :)
    Kommt halt immer auch etwas drauf an was dann alles genau gemacht wird/werden soll. Wenn da noch etlicher Quelltext dazu kommt wird es schnell unübersichtlich.


    Viele Wege führen halt nach Rom :winking_face:

    Meine Projekte: TVB-Parser, WebIF-Expert, DreamBox-Offline-Timer, StandBy2DeepStandBy...

  • Zitat

    Original von Peq


    Es geht hier ganicht um das OR, Thema verfehlt, sechs, setzen :face_with_rolling_eyes:


    Du hast sicher den Titel des Threads, die OP und Axel's Antwort gelesen ... warte, wohl doch nicht! Ich sehe da OR im Titel, oder in der OP, und -o in Axel's Antwort.


    Und letztlich sollte es als sinnvoll erachtet werden, nicht nur Lösungen präsentiert zu bekommen, sondern ein Verständnis aufzubauen. Und drum hier nochmal zur Erläuterung: Die Sequenz
    if [ -n "$a" ] :tired_face: [ -n "$b" ]; then ...
    bzw. ihr Äquivalent
    test -n "$a" :tired_face: test -n "$b" && ...
    bedeutet:
    (1) Teste ob die Variable a nicht leer ist. Fahre fort mit (2), falls das Ergebnis false ist, andernfalls breche ab.
    (2) Teste of die Variable b nicht leer ist. Fahre fort, falls das Ergebnis false ist, andernfalls breche ab.


    Die Sequenz
    if [ -n "$a" -o -n "$b" ]; then ...
    bzw. ihr Äquivalent
    test -n "$a" -o -n "$b" && ...
    wiederum bedeutet:
    (1) Teste ob die Variable a oder die Variable b nicht leer ist. Breche ab, falls false, andernfalls fahre fort.


    Obwohl das Ergebnis so identisch ist (zumindest solange die Evaluierungen von $a und $b frei von Nebeneffekten sind), ist die Interpretation auf der Ebene der Bool'schen Logik eine andere. Erstes nämlich setzt eine sog. Implikation ein, letztes ein OR.


    Nebenbei: Der logische Ausdruck wird bei der letzten Variante durch einen einzelnen Aufruf des test Kommandos berechnet, während in der ersten Variante die Shell die eigentliche Auswertung übernimmt, und dazu 2 Aufrufe des test Kommandos ausführt. Damit ergeben sich also Laufzeitunterschiede, die aber sicherlich im vorliegenden Fall keine Rolle spielen.

  • Agrivaine
    Danke dir eine gute Möglichkeit auch dieses zu versuchen.
    was ich mache ist folgendes:
    Ich habe verschiedene Boxen und will spezifische Files backupen und ablegen bevor ich diese Image. Darunder sind cfg s, bougets, passwd, Conf, network usw... jemand wird sagen es gibt ja im Gemini das backup/restore plugIn ja stimmt aber dies was ich mache ist zugeschnitten zu jeder Typ Box und backupe diese mit Telnet einiges einfacher und so kann ich auch Boxen aus meiner Verwandschaft fern Imagen und Backupen ohne dass diese zu heuse sind und muss nicht immer vorbei gehen.
    haegarr
    Einen Lob für dir das du dir die Zeit genommen hast mir das zu erklären :respekt: so habe ich es auch verstanden und werde meinen script auch in dieser Variante versuchen.
    Bin kein Shell scripter aber mit eurer Hilfe werde ich etwas wunderfolles auf die Beine stellen!!


    Danke.

  • :)


    Nur noch so als Tipp. Spare nicht mit Kommentaren und rücke den Text am besten immer ein. Bei einem 10 oder 20 Zeiler ist es gerade noch so übersichtlich. Danach verlierst du, gerade wenn du mit den IF-Schleifen arbeitest, sehr schnell den Überblick wo eine Schleife beginnt und wo sie endet.

    Meine Projekte: TVB-Parser, WebIF-Expert, DreamBox-Offline-Timer, StandBy2DeepStandBy...

  • Zitat

    Original von Agrivaine
    Wenn es funktioniert :)
    Kommt halt immer auch etwas drauf an was dann alles genau gemacht wird/werden soll. Wenn da noch etlicher Quelltext dazu kommt wird es schnell unübersichtlich.


    Viele Wege führen halt nach Rom :winking_face:


    Noch eine Frage woran erkennst du ob es eine 600er oder 7025 box ist?? iregned wie musst du doch den Hostname auslesen oder irre ich mich und sehe es nicht??

  • Zitat

    Original von ezo
    Noch eine Frage woran erkennst du ob es eine 600er oder 7025 box ist?? iregned wie musst du doch den Hostname auslesen oder irre ich mich und sehe es nicht??


    Nein, du irrst nicht. Deswegen "Schnipp" wie "Schnipsel", also nur ein Teil des Codes. In $I muss hier der Boxname ermittelt werden bzw. stehen. Dies geht am einfachsten mit

    Code
    I=`uname -n`


    Die Sub-Routinen habe ich nur deshalb gewählt, da du augenscheinlich nach E1- und E2-Boxen unterscheidest. Sonst müsstest du z.B. bei einer 7020 und 600 den Quelltext doppelt einfügen. Am Beispiel der 7025 siehst du aber auch, dass du auch direkt und ohne (oder auch und/mit) Sub-Routinen arbeiten kannst.
    Da die Sub-Routinen auch Parameter verarbeiten können (deswegen die leeren Klammern bei deren Definition), kannst du auch den Boxtyp mit übergeben und so bei z.B. "Eeins" nochmals innerhalb der Routine zwischen 600 und 7020 etc. unterscheiden.

    Meine Projekte: TVB-Parser, WebIF-Expert, DreamBox-Offline-Timer, StandBy2DeepStandBy...