Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Frage zu Bash und mehrfach Bedingungen

  1. #1
    Registrierter Benutzer
    Registriert seit
    Sep 2018
    Beiträge
    5

    Frage zu Bash und mehrfach Bedingungen

    Hallo Gemeinde,

    dies ist mein erster Beitrag bzw. Frage. Falls das hier nicht richtig untergebracht ist, bitte Sir Admin, dann eben verschieben.

    Danke vorab.

    Versuche mich seit einiger Zeit im Bash Sripten. Aber da ich das nie richtig gelernt habe, stolpere ich gerne mal über simple Dinge und da bräuchte ich mal Hilfe.
    Habe zu meinem Problem schon einiges gelesen, aber so recht mag das nicht klappen. Aber nun zu meinem Problem:

    Um diverse Dinge zu steuern, benutze ich "dialog" um ein Menu zu erstellen. Das klappt soweit.

    Die Aufgabe ist nun, damit Programme zu starten und zu beenden. Dazu prüfe ich zunächst mit "pidof" nach um festzustellen, ob das Programm bereits läuft. Dementsprechend
    ändert sich per Variable auch der Text im Menu. Beispiel:

    1. Programm A starten # Programm läuft nicht
    2. Programm B beenden # Programm läuft bereits

    .....usw.

    Auch das funktioniert.

    Betrachten wir mal nur einen Menupunkt 1. Wenn ich den Punkt anwähle, dann wird die Variable "$choise" mit dem Rückgabewert befüllt. Nun kann "choise" bei der Auswahl
    des ersten Menupunkts ja immer nur "1" sein, egal was drin steht. Allerdings wechselt der Menupunkt 1 ja seine Funktion.

    Er zum Einschalten und wenn das Programm läuft zum Ausschalten benötigt. Sieht also so aus:


    1. Programm A starten oder eben 1. Programm A beenden

    Jedoch wie gesagt, es kommt immer eine "1" zurück, wenn man es anwählt. Das hat mich dann zu folgender Überlegung geführt, bei der die Variable $progg1 als zweite Bedingung abgefragt werden soll.

    Code:
    if [ "$choise" = "1" ] && [ $proggi1<0 ];
    then
    
            clear;
            echo "Programm 1 gewaehlt und gestartet";
            sleep 3;
    fi
    
    if [ "$choise" = "1" ] && [ $progg1>0 ];
    then
    
            clear;
            echo "Programm 1 gewaehlt und beendet";
            sleep 3;
    fi
    Das hat zur Folge, dass erst die "if then" abgearbeitet wird und direkt danach die zweite if Schleife. Die Ausgabe lautet hintereinander

    Programm 1 gewaehlt und gestartet
    Programm 1 gewaehlt und beendet

    Alternativ habe ich den Operator "&&" gegen "-a" getauscht. Dann passiert gar nichts mehr.

    Vielleicht liegt es an der falschen Syntax, aber des wegen frage ich ja hier.


    Danke schon mal vorab fürs Durchlesen


    Grüße
    Geändert von BananaPi (27.10.18 um 14:26 Uhr)

  2. #2
    Registrierter Benutzer Avatar von ThorstenHirsch
    Registriert seit
    Nov 2002
    Beiträge
    6.558
    Vorweg glaube ich, dass nicht die Syntax das Problem ist, sondern Struktur und Planung. Am besten schaust Du mal, wie andere eine GUI programmiert haben. Spontan würde ich vorschlagen, dass Du einen Loop für die GUI baust und darin Funktionen aufrufst. Das macht die Sache viel übersichtlicher als globale Variablen in vielen IF/THEN/ELSE-Ketten.

    Und noch 2 Kleinigkeiten:
    - es heißt choice mit c
    - oben steht $proggi1, unten jedoch $progg1

    Tipp: Überleg Dir bessere Variablennamen. Weder auf Englisch noch Deutsch schreibt man "program" bzw. "Programm" mit Doppel-g in der Mitte und Du siehst ja, wozu es führt, wenn man es abkürzt: man weiß nach 8 Zeilen nicht mehr wie man es zuletzt abgekürzt hatte, also besser nicht abkürzen.
    ¡Nuestro amigo... el Computador!

  3. #3
    Registrierter Benutzer
    Registriert seit
    Apr 2011
    Ort
    Bergheim
    Beiträge
    135
    Zitat Zitat von ThorstenHirsch Beitrag anzeigen
    - oben steht $proggi1, unten jedoch $progg1
    Das ist immer ein Problem von Skirptsprachen, die keine expliziete Varialblendeklaration verlangen.
    Die Bash gehört dazu. Bei Perl kann man das mit einem einfachen "use strict;" Befehl ermöglichen und dann fallen einem solche Fehler sofort auf. So ein Fehler kann einem den letzten Nerv rauben, ich weiß das aus leidvoller Erfahrung mit div. Skriptsprachen (Bash, Powershell z. B.).
    Was helfen kann ist eine klare Unterscheidung der Variablennamen und dann das stumpfe Kopieren jedes einzelnen Variablennamens, so dass man den Fehler ausschließen kann.

  4. #4
    Registrierter Benutzer
    Registriert seit
    Apr 2011
    Ort
    Bergheim
    Beiträge
    135
    Habe eben mal nachgeschaut, meine Aussage ist so falsch, man kann auch in der Bash Variblen deklarieren. Das wußte ich so noch nicht. Wieder was gelernt. ;-)
    Siehe z. B. hier:
    http://tldp.org/LDP/abs/html/declareref.html
    oder hier
    https://code.i-harness.com/de/q/2d11ae

  5. #5
    Registrierter Benutzer
    Registriert seit
    Sep 2018
    Beiträge
    5
    Hallo Karl-Heinz, hallo Thorsten,

    @Thorsten:
    Ja, die GUI und die dadurch aufrufbaren Prozeduren laufen bereits in Funktionen, jedoch nicht die Abfragen der Variablen sowie die Auswertung der Rückgabewerte von "dialog". Aber es war wohl tatsächlich die Syntax, nur ....... dazu weiter unten mehr.
    Das mit dem choice habe ich geändert, obwohl das keine Änderung zur Folge hatte. ein Schreibfehler halt. Einen richtigen Schreibfehler, ja, das habe ich auch sofort geprüft, war das mit den proggi. Allerdings habe ich das hier beim editieren meiner Anfrage falsch gemacht, im Programm stand es richtig. War leider nicht die Lösung. Wäre auch zu einfach gewesen Werde aber Deine Anregungen künftig beherzigen

    @Karl-Heinz:
    Nun, bei den Variablennamen bin ich mir ganz sicher. Ich habe bereits ein Script, welches auch läuft. Allerdings ist das doof, weil es zum Ein- und Ausschalten je einen Menupunkt hat. Die Blöcke konnte ich da aber incl. Var Namen herauskopieren. Habs auch noch mal geprüft, alles ok.

    Hier die Lösung und direkt ein Kuriosum:

    Die Lösung scheint zu sein

    Code:
    if [[ $choice = 5 && $programm<0 ]]
    Also die Bedingung der if Abfrage in zwei rechteckige Klammern zu setzen. Das funktioniert auch prima. Und nun kommts.......

    Ich habe hier drei Menupunkte, bei denen diese Abfragen in gleicher Weise arbeiten. Bei zweien funktioniert es. Das sind die, in der in der Bedingung auch noch das Vorhandensein der Pid abgefragt wird.
    Bei einem Menupunkt, wird eine Variable abgefragt, dessen Ursprung der Status eines GPIO`s ist. Also 0 oder 1.

    Der dritte, welcher nicht klappt ist so aufgebaut

    Code:
    if [[ $choice = 4 && $sol=0 ]]
    then
    	
    	funktion1
    
    fi
    
    if [[ $choice = 4 && $sol=1 ]]
    then
    	funktion2
    
    fi
    Also im Wesentlichen genau so, wie die anderen beiden. Aber es passiert hier genau wieder das, warum ich diese Anfrage auch gestellt habe, es wird erst die Funktion1 durch, danach die Funktion2.

    Habe es dann geprüft, in dem ich mir die Funktionen durch echo "text1" und echo "text2" anstelle der Funktionen anzeigen lassen. Und siehe da, es wurde

    text1
    text2

    angezeigt. Dabei spielt es keine Rolle, ob die Variable $sol=1 ist oder 0. Es läuft einfach durch, als sei es ein Stapel. Eine Differenzierung findet nicht statt. Aber warum nicht, zumal die Syntax dieselbe ist, wie zuvor gezeigt?

    Habt Ihr noch eine Idee??


    Güße

    BananaPi
    Geändert von BananaPi (28.10.18 um 13:20 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    Sep 2018
    Beiträge
    5
    Hallo Karl-Heinz, hallo Thorsten,

    @Thorsten:
    Ja, die GUI und die dadurch aufrufbaren Prozeduren laufen bereits in Funktionen, jedoch nicht die Abfragen der Variablen sowie die Auswertung der Rückgabewerte von "dialog". Aber es war wohl tatsächlich die Syntax, nur ....... dazu weiter unten mehr.
    Das mit dem choice habe ich geändert, obwohl das keine Änderung zur Folge hatte. ein Schreibfehler halt. Einen richtigen Schreibfehler, ja, das habe ich auch sofort geprüft, war das mit den proggi. Allerdings habe ich das hier beim editieren meiner Anfrage falsch gemacht, im Programm stand es richtig. War leider nicht die Lösung. Wäre auch zu einfach gewesen Werde aber Deine Anregungen künftig beherzigen

    @Karl-Heinz:
    Nun, bei den Variablennamen bin ich mir ganz sicher. Ich habe bereits ein Script, welches auch läuft. Allerdings ist das doof, weill es zum Ein- und Ausschalten je einen Menupunkt hat. Die Blöcke kann ich da aber incl. Var Namen herauskopieren. Habs auch noch mal geprüft, alles ok.

    Hier die Lösung und direkt ein Kuriosum:

    Die Lösung scheint zu sein

    Code:
    if [[ $choice = 5 && $apx<0 ]]
    Also die Bedingung der if Abfrage in zwei rechteckige Klammern zu setzen. Das funktioniert auch prima. Und nun kommts.......

    Ich habe hier drei Menupunkte, bei denen diese Abfragen in gleicher Weise arbeiten. Bei zweien fuktioniert es. Das sind die, in der in der Bedingung auch noch das Vorhandensein der Pid abgefragt wird.
    Bei einem Menupunkt, wird eine Variable abgefragt, dessen Ursprung der Status eines GPIO`s ist. Also 0 oder 1.

    Der dritte, welcher nicht klappt ist so aufgebaut

    Code:
    if [[ $choice = 4 && $sol="0" ]]
    then
    	
    	funktion1
    
    fi
    
    if [[ $choice = 4 && $sol="1" ]]
    then
    	funktion2
    
    fi
    Also im Wesentlichen genau so, wie die anderen beiden. Aber es passiert hier genau wieder das, warum ich diese Anfrage auch gestellt habe, es wird erst die Funktion1 durch, danach die Funktion2.

    Habe es dann geprüft, in dem ich mir die Funktionen durch echo "text1" und echo "text2" anstelle der Funktionen anzeigen lassen. Und siehe da, es wurde

    text1
    text2

    angezeigt. Dabei spielt es keine Rolle, ob die Variable $sol=1 ist oder 0. Es läuft einfach durch, als sei es ein Stapel. Eine Differenzierung findet nicht statt. Aber warum nicht, zumal die Syntax dieselbe ist, wie zuvor gezeigt?

    Habt Ihr noch eine Idee??


    Grüße

    BananaPi

  7. #7
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Ich finde Bash an dieser Stelle ziemlich unbefriedigend, dieser Wirrwarr aus if [], if [[]], if (()), gefällt mir gar nicht. Aber immer hin, ist es Dokumentiert und Kommentiert - an vielen Stellen.

    Neben den gelinkten gibt es zB hilfreiches auf http://wiki.bash-hackers.org

    Für dein Kuriosum, das solltest du als erstes "los werden" http://wiki.bash-hackers.org/syntax/...nal_expression -> http://mywiki.wooledge.org/BashFAQ/031

    Mir fällt es auch ein bisschen schwer zu verstehen, was genau dein Problem ist
    Code:
    choice=4
    sol=1
    echo "choice: ${choice}, sol: ${sol}"
    if [[ $choice = 4 && $sol="1" ]];then
     echo "[[ $choice = 4 && $sol="1" ]] is true"
    else
     echo "[[ $choice = 4 && $sol="1" ]] is false"
    fi
    choice=1
    sol=4
    echo "choice: ${choice}, sol: ${sol}"
    if [[ $choice = 4 && $sol="1" ]];then
     echo "[[ $choice = 4 && $sol="1" ]] is true"
    else
     echo "[[ $choice = 4 && $sol="1" ]] is false"
    fi
    echo "bye"
    in https://www.tutorialspoint.com/execute_bash_online.php einfügen und ausführen
    Ergebnis:
    Code:
    $bash -f main.sh
    choice: 4, sol: 1
    [[ 4 = 4 && 1=1 ]] is true
    choice: 1, sol: 4
    [[ 1 = 4 && 4=1 ]] is false
    bye
    Ggf noch mal mehr Code zeigen, oder ein passende Beispiel posten (eigentlich Besser, so machen die es in der Doku ja auch). Was mir auffällt, ein Mix aus "Int" und "String" - $choice = 4 && $sol="1" - die Online Bash optimiert das stillschweigend weg, aber da wird das Problem liegen, du musst diese "conditional expressions" für Bash verstehen (oder eine Sprache wählen, da nicht so ein Wirrwarr benötigt )

    TL;DR; rtfm http://wiki.bash-hackers.org/syntax/...nal_expression / http://tldp.org/LDP/Bash-Beginners-G...ect_07_01.html
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  8. #8
    Registrierter Benutzer
    Registriert seit
    Sep 2018
    Beiträge
    5
    Hallo nopes,

    vielen Dank für das Vertrauen in meine Fähigkeiten, aber ...........

    Wir haben hier für unser Hobby ein Projekt bei dem wegen schon der verschiedenen Komponenten verschiedene Programmiersprachen zum Einsatz kommen. Und auch die haben wir alle nicht gelernt und strampeln uns durchs Netz oder als mühen uns als Autodidakt ab. Und nun noch eine weitere Programmiersprache....... Sorry.

    Habe für den Zweck Bash gewählt, weil ich das halbwegs hin bekomme.

    Was das Kuriosum angeht, da werde ich jetzt noch einmal dran arbeiten. Denke, es wird auf ein neues Script hinauslaufen, welches bis auf den Kern des Problems reduziert ist. Dies würde ich dann hier gerne noch einmal vorstellen wollen, um es mit Euch zu diskutieren. Vielleicht wird es dann auch etwas transparenter.

    Dafür brauche ich allerdings etwas Zeit, denn Brötchen verdienen muss ich auch noch

    Melde mich......



    Grüße

    BananaPi

  9. #9
    Registrierter Benutzer
    Registriert seit
    Sep 2018
    Beiträge
    5
    Guten Abend.........

    So, hat leider wegen Familie Krank etwas gedauert, aber heute war Zeit zur Ursachenforschung.

    Zunächst, ja es gab Syntaxfehler, bzw falscher Operator. Der erste ist wohl, so sieht es zumindest für mich aus, dass wenn ich eine Variable auf 0 (Null) prüfe, kann ich nicht so verfahren:

    Code:
    if [ $Programm1 = 0 ]
    Dies hatte nämlich zur Folge, das es einen falschen Rückgabewert erzeugt hat.

    besser ist:

    Code:
    if [ $Programm1 -eq 0 ]
    Zumindest funktioniert das bei mir so. Mit einer ganzen ganzen Zahl, wäre es kein Problem gewesen. Aber ich hatte nun mal die Zustände 0 oder 1 in den Variablen. In letzter Konsequenz war es dann auch nicht mehr so, dass erst die Bedingung 1 ausgewertet und als "wahr" interpretiert wurde und im Weiteren Bedingung 2 ebenso. Sofern von Interesse, habe ich hier mal die Steuerung eingefügt.
    Man kann mit den Variablen etwas spielen und sich das Ergebnis dann ansehen. Sorry, für die vielen If- then und else, aber an den Feinheiten und Scriptkosmetik kann ja noch gearbeitet werden
    Nehme da auch gerne Tips an. Dümmer wird man sicher nicht dadurch und ich bin da auch zu fast jeder Schandtat bereit, sofern ich verstehe was da passiert.

    Sollte sich jemand der Sache annehmen wollen, ich brauch was handfestes. Sorry, aber mit Abstrakten Antworten kann ich meist nicht fiel anfangen

    Hier mein Test Script:

    Code:
    #!/bin/bash
    
    export NCURSES_NO_UTF8_ACS=1
    
    
    
    
    function start_menu {
    
    choice=`dialog --stdout --no-cancel --colors --menu "Hauptmenu" 0 0 0 "1" "Programm 1 $v1" "2" "Programm 2 $v2" "3" "Relais $v3"`
    
    }
    
    
    while true; do
    
    redraw() {
    clear
    }
    
    trap redraw WINCH
    
    redraw
    
    #######  Abfrage der aktuellen Zustände Programm/ und Relais ##########
    
    #Programm1=$(pidof Programm1)	#Abfrage ob Programm1 läuft	#<- Originalabfrage hier nur zum Verständnis
    #Programm2=$(pidof Programm2)	#Abfrage ob Programm2 läuft	#<- Originalabfrage hier nur zum Verständnis
    #Relais="$( gpio read 27 )"	#Abfrage Relais			#<- Originalabfrage hier nur zum Verständnis
    
    
    # Variablen nur um Testen um das Verhalten zu prüfen. Entweder 0 oder >0
    
    Programm1=0	#<- fiktive PID
    Programm2=424	#<- fiktive PID
    Relais=0	#<- entweder 0 oder 1 möglich
    
    
    #######  Zuordnen der Begriffe für Darstellung im Menu ################
    
    if [[ $Programm1 -eq 0 ]]
    then
    	v1="starten"
    	
        else
    
    	v1="beenden"
    fi
    
    if [[ $Programm2 -eq 0 ]]
    then
    	v2="starten"
    	
        else
    
    	v2="beenden"
    fi
    
    if [[ $Relais = 1 ]]
    then 
    	v3="einschalten"
    
        else
    
    	v3="ausschalten"
    fi
    
    
    ####### Hauptmenu aufrufen ####################
    
    start_menu
    
    ######## Programm1 Starten/Stoppen ############
    
    if [[ $choice = 1 && $Programm1 -eq 0 ]]		#<- Abfrage ob Programm1 nicht läuft
    then
    	clear
    	echo "$Programm1"
    	sleep 3
    	echo "Programm1 laeuft nicht, da Variable 0"
    	sleep 3
    
    	
    fi
    
    if [[ $choice = 1 && $Programm1 > 0 ]]		#<- Abfrage ob Programm1 läuft
    then
    	clear
    	echo "$Programm1"
    	sleep 3
    	echo "Programm1 laeuft, da Variable groesser 0"
    	sleep 3
    	
    fi
    
    ######## Programm2 Starten/Stoppen ############
    
    if [[ $choice = 2 && $Programm2 -eq 0 ]]		#<- Abfrage ob Programm2 nicht läuft
    then
    	clear
    	echo "$Programm2"
    	sleep 3
    	echo "Programm2 laeuft nicht, da Variable 0"
    	sleep 3
    
    	
    fi
    
    if [[ $choice = 2 && $Programm2 > 0 ]]		#<- Abfrage ob Programm2 läuft
    then
    	clear
    	echo "$Programm2"
    	sleep 3
    	echo "Programm2 laeuft, da Variable groesser 0"
    	sleep 3
    	
    fi
    
    
    ######## Umschaltung Relais ############
    
    if [[ $choice = 3 && $Relais -eq 0 ]]		#<- Abfrage, ob Relais abgefallen ist
    then
    	
    	clear
    	echo "$Relais"
    	sleep 3
    	echo "Schalte Relais EIN"
    	sleep 3
    fi
    
    if [[ $choice = 3 && $Relais -eq 1 ]]		#<- Abfrage, ob Relais angezogen hat
    then
    
    	clear
    	echo "$Relais"
    	sleep 3
    	echo "Schalte Relais aus"
    	sleep 3 
    fi
    done


    Grüße

    BananaPi
    Geändert von BananaPi (02.11.18 um 08:00 Uhr)

Ähnliche Themen

  1. bash history mehrfach doppelte Einträge
    Von schani im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 31.10.11, 09:17
  2. [BASH] Case-Bedingungen auflisten
    Von nalye im Forum Anwendungen Allgemein, Software
    Antworten: 12
    Letzter Beitrag: 15.07.10, 12:43
  3. Dateien löschen, die bestimmte Bedingungen erfüllen
    Von Kastro im Forum Anwendungen Allgemein, Software
    Antworten: 5
    Letzter Beitrag: 22.09.07, 19:02
  4. Mutt und Bedingungen
    Von fluppi im Forum Linux als Server
    Antworten: 1
    Letzter Beitrag: 09.12.05, 10:44
  5. Bedingungen in Bashscript auswerten
    Von mdkuser im Forum Linux Allgemein
    Antworten: 8
    Letzter Beitrag: 22.02.04, 16:32

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •