Bash Variablenzuweißung

  • Hallo !
    Dies ist ein Teil meines Scripts, welches Testen soll ob eine Dbox Online ist.
    Die Ausgaben am VDR stimmen.
    Der Variable ONLINE soll entweder 1 oder 2 zugewiesen werden.
    Das Test Echo bei Box nicht online gibt auch eine 2 aus.
    Doch außerhalb der while schleife wird immer eine 0 Ausgegeben.
    Also so wie am Anfang deklariert :wand
    Warum ist das so ?


    Bin Einsteiger in Linux Scripting - wo liegt der Fehler ?


    Gruß

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • Moin,


    die runde Klammer '(' macht eine neue Shell auf, Änderungen in der Shell sind beim Verlassen (')') wieder weg. Was Du willst, ist die geschweifte Klammer ('{' und '}'), die einen logischen Block definieren, eine Änderung an einer Variablen ist dann auch außerhalb des Blockes sichtbar.


    Gruß,
    ARK

    VDR
    ASUS A7N8X-X, AMD 2600+, 2 GB, 320 GB HD, Hauppauge DVB-S 1.3, Hauppauge Nova-S-Plus, Funktastatur
    Debian 4.0/Etch-Kernel 2.6.18-5-486
    c't-VDR 6.1 mit e-tobi 1.6.0 (neu gepatched ohne sortrecordings), acpi, vdradmin-am, burn, osdteletext, ffnetdev, audiorecorder, infosatepg, ...
    Client
    dbox2 (Sagem 2xI_C) mit Neutrino-Derivat

  • Ich denke, Du machst mit dem ( .. ) ein Subshell auf, in der keine dervorhandenen Variablen bekannt sind (bzw. keine zurückgegeben werden).
    Ohne es ausprobiert zu haben denke ich, dass das while auch nicht nötig ist, da Du ja schon den ping-count auf 1 beschränkst und egrep den interessanten Teil herausholst (eine Zeile).
    Oder Du wertest mit $? den Returncode von Ping aus: 0=ok, 1= nicht erreicht, also

    Code
    ping $BOXIP -c 1
    ONLINE=$?
  • Zitat

    Ich denke, Du machst mit dem ( .. ) ein Subshell auf, in der keine dervorhandenen Variablen bekannt sind (bzw. keine zurückgegeben werden).


    Also dann mit den { } Klammern.



    Leider das selbe Ergebnis.
    Die Block Definition ist aber hier im prinzip doch nötig - oder ?



    Zitat

    Ohne es ausprobiert zu haben denke ich, dass das while auch nicht nötig ist, da Du ja schon den ping-count auf 1 beschränkst und egrep den interessanten Teil herausholst (eine Zeile).


    Stimmt - es kommt nur eine Zeile. (Also While sinnlos)


    Mir geht es auch um den Lerneffekt ;)


    Gruß

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • Hi rudirabbit,

    Zitat

    Original von rudirabbit
    Doch außerhalb der while schleife wird immer eine 0 Ausgegeben.
    Also so wie am Anfang deklariert :wand


    Ursache ist, wie hier ja schon gesagt wurde, die 2. Shell.
    Versuch mal folgendes:


    Am Anfang des Scripts:

    Code
    export ONLINE="0"
    ...


    Das sollte eigentlich helfen. Wenn Du nicht möchtest, dass die Variable ausserhalb des Scripts nicht sichtbar sein soll, dann musst du am Ende noch ein

    Code
    ...
    unset ONLINE


    einfügen.

    cu -HD-

    VDR1 (stable),
    yavdr 0.3: POV330 ION, 3GB, OCZ Vertex2 60GB, DD Octopus 1xDuoFlexS2

  • Es ist noch eine Sub-Shell versteckt, und zwar im | Pipe-Kommando.


    Mir sind zwei Wege bekannt, wie man eine Pipe-artige Auswertung machen kann, ohne eine Subshell zu eröffnen. Folgendes Beispiel funktioniert nicht, da der zweite Teil der Pipe in einer Subshell läuft:


    Code
    { echo test1 ; echo test2 ; } | { read line1 ; read line2 ; }
    echo $line1
    echo $line2


    Die folgenden Varianten funktionieren dagegen:


    1. Here-Strings mit Kommando-Substitution:


    Code
    { read line1 ; read line2 ; } <<<"`echo test1 ; echo test2`"
    echo $line1
    echo $line2


    Hier wird aber die komplette Ausgabe in die Kommandozeile umgelenkt und von dort wieder in die Standardeingabe, was u.U. unangenehme Nebeneffekte haben kann.



    2. Prozess-Substitution mit FIFOs:


    Code
    { read line1 ; read line2 ; } < <(echo test1 ; echo test2)
    echo $line1
    echo $line2


    Der <(...) Block wird hier durch einen Dateinamen ersetzt, aus dem das jeweilige Programm die Standardausgabe des (...) Block lesen kann. Eine Umlenkung über Kommandozeile findet nicht statt.


    Dafür ist diese Methode beschränkt auf Systeme, die entweder named pipes anbieten, oder das /dev/fd/ Dateisystem. Windows-Portierungen sind damit schon mal ausgeschlossen.



    Man kann das ganze natürlich auch umgehen, in dem man mit out=`echo test1 ; echo test2` erst mal die Ausgabe komplett in eine Shell-Variable lenkt, und diese dann ganz ohne Umlenkung weiter verarbeitet.



    Gruß,


    Udo

  • Hallo !
    Danke für die Hilfe.
    Mit war zuerst gar nicht klar das nach dem
    ping $BOXIP -c 1 | egrep 'packets' |\
    Eine 2 Shell gestartet wird.
    Ein

    Code
    export ONLINE="0"

    am Anfang des Main Scripts macht so ich es verstehe die Variable in der Child Shell public, wenn diese dort aber
    verändert wird, bekommt dies das Main Script (Shell) nicht mit.


    Habe das Problem mit dem Exit Code gelöst
    Am Ende der Child Shell ein exit $ONLINE
    Im Main Script mit ONLINE=$? importieren.


    Wie gesagt bin Script Anfänger, mache halt learning by doing.


    Mache relativ viel mit Delphi, finde aber dieses Linux Scripting ungleich komplexer :evil:


    Gruß Rudi

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • Wann immer man mehrere Befehle verkettet ( mit oder ohne subshells ) , ist $PIPESTATUS interessant :


    Allgemein :


    ( <command> 2>&1 | tee command.log && exit $PIPESTATUS )


    Ohne exit $PIPESTATUS bekommt man den rc von tee - mit den von <command> .


    HJS

    Working VDR : VDR-1.4.6 - ACPI/NVRAM Wakeup - working on hjslfs

    Einmal editiert, zuletzt von hjs ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!