if Abfrage und -a, was geht ?

  • Hi,


    Mal ne Frage zu folgendem Beispiel;


    Code
    if [ -e /var/lib/vdrmedia/film/mpg/001.mpv ] -a [ -e /var/lib/vdrmedia/film/mpg/001.mpa ] ; then
    if [ -e /var/lib/vdrmedia/film/mpg/001.mpv -a -e /var/lib/vdrmedia/film/mpg/001.mpa ]; then


    Was davon ist richtig ?


    Geht auch noch mehr als zwei Bedingungen mittels -a
    z.b:

    Zitat

    if [ -e /var/lib/vdrmedia/film/mpg/001.mpv ] -a [ -e /var/lib/vdrmedia/film/mpg/001.mpa ] -a [ -e /var/lib/vdrmedia/film/mpg/001[1].mpa ]; then


    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Zitat

    Original von Bert
    Was davon ist richtig ?


    Nix :gap
    Beispiel, wie's funktioniert:

    Code
    if [ "$SR" = "-d" -a "$2" != "" ]; then [...]

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Hi,


    Nix > ist gut, sowas hab ich schon befürchtet :schiel


    Danke für das Beispiel, aber das kann ich noch nicht umsetzen auf mein Beispiel.
    Werd mich mal weiter schlau machen.


    Wie ist es mit der Frage ob mit -a auch noch mehr geht als zwei Bedingungen die gleichzeitig erfüllt sein müssen ?



    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • if ([ -e /var/lib/vdrmedia/film/mpg/001.mpv ] && [ -e /var/lib/vdrmedia/film/mpg/001.mpa ]); then[/code]


    Du kannst so viele &&[ -e ...] Konstrukte aneinanderreihen wie du magst, existiert eine Datei nicht, ist der gesamte Ausdruck false.

  • Hi,


    Zitat
    Code
    if ([ -e /var/lib/vdrmedia/film/mpg/001.mpv ] && [ -e /var/lib/vdrmedia/film/mpg/001.mpa ]); then

    Du kannst so viele &&[ -e ...] Konstrukte aneinanderreihen wie du magst, existiert eine Datei nicht, ist der gesamte Ausdruck false.


    Das is mal ne Antwort, Danke !



    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

    Einmal editiert, zuletzt von Bert ()

  • Zitat

    Original von knebb
    Nix :gap


    Warum ? Version 2 geht doch, zumindest bei mir.

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

  • Die zweite Version ist auch durchaus richtig. "[" ist nur ein alias für "test", für eine etwas hübscher aussehende Syntax -> man test hilft weiter bei solchen Fragen.

    Asrock A75 Pro4-M
    Debian wheezy (testing, stock) (aktuell 2012-08-24: Linux 3.2, VDR 1.7.28)
    vdr-sxfe (xineliboutput)
    Pioneer VSX-520-K

  • Hi, Jungs


    Zitat

    Warum ? Version 2 geht doch, zumindest bei mir.


    und

    Zitat

    Die zweite Version ist auch durchaus richtig. "[" ist nur ein alias für "test", für eine etwas hübscher aussehende Syntax -> man test hilft weiter bei solchen Fragen.


    Also doch, wenigstens eines richtig!


    Danke an Euch für die Richtigstellung



    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Hi,


    Also das hier;




    scheint zu funktionieren wobei aber das;


    Code
    if ([ -e $TARGETDIR/001.mpv ] && [ ! -e $TARGETDIR/001.ac3 ] && [ -e $TARGETDIR/001.mpa ] && [ ! -e $TARGETDIR/001[1].mpa ]); then


    hier nicht funkt (also mit den () Klammern zusätzlich)
    weiss jemand warum das nicht klappt mit den zusätzlichen Klammern ?



    Weiters deckt das nicht alle Varianten zum Muxen eventuell vorhandener
    oder auch nicht vorhandenen Tonspuren ab
    (aber die wichtigsten denke ich).


    Gäbs da schönere Lösungen als ne if Abfrage ?



    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Zitat

    Original von Bert
    ... wobei aber das;


    Code
    if ([ -e $TARGETDIR/001.mpv ] && [ ! -e $TARGETDIR/001.ac3 ] && [ -e $TARGETDIR/001.mpa ] && [ ! -e $TARGETDIR/001[1].mpa ]); then


    hier nicht funkt (also mit den () Klammern zusätzlich)
    weiss jemand warum das nicht klappt mit den zusätzlichen Klammern ?


    Ist schon klar.
    Shell scripting ist halt keine "echte" Programmiersprache.


    Die Syntax von if lautet


    if <programmaufruf>
    then
    <do whatever you want>
    fi


    Wenn der <programmaufruf> einen Retuncode > 0 zurück gibt wird der der if Zweig halt nicht ausgeführt.


    (<irgendwas>) ist kein Programmaufruf und somit Syntaktisch falsch.

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

  • Hi, pinky666


    Gut erklärt (so verstehs auch ich) !
    Danke für die Info



    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Zitat

    Original von pinky666
    (<irgendwas>) ist kein Programmaufruf und somit Syntaktisch falsch.


    Doch, das ist ein Programmaufruf in einer Subshell. Zumindest in bash. Die erbt das Environment und gibt den Returncode der ausgeführten list zurück. Also im Prinzip das gleiche wie ohne die Klammern, nur dass Deklarationen oder Änderungen von Variablen innerhalb der Klammern lokal sind und das externe Environment nicht beeinflussen.


    D.h. wenn das bei Bert nicht geht, ist entweder ein Tippfehler drin oder er hat eine andere Shell. In dem Fall wäre interessant zu wissen, welche.

  • Genaugenommen ist auch der Begriff "Programmaufruf" nicht richtig. Das Konstrukt für Shellscripts sieht so aus:


    if LIST
    then LIST
    else LIST # (optional)
    fi


    LIST ist eine beliebige Sequenz von Befehlen, abgeschlossen durch newline oder ein Semikolon.


    Entscheidend ob die LIST nach then oder die nach else ausgeführt wird ist der exitcode des letzten in der if-LIST ausgeführten Befehls.


    Deshalb funktioniert auch die Verknüpfung verschiedener test-Befehle mit && -- der erste, der einen exitcode != 0 zurückgibt bricht die Ausführung der LIST ab.


    Wenn man ohnehin nur "test" (alias "[") braucht in der Bedingung sollte man aber lieber die Option "-a" von test zur logischen Verknüpfung mehrerer Bedingungen verwenden. Ansonsten muss die Shell nämlich mehrfach "test" aufrufen, das ist vor allem hässlich bei Shells, die "test" nicht als builtin haben (z.B. die dash).


    Wie mein Vorposter schon schrieb, runde Klammern führen in einer Subshell aus, sollten daher also zu keinem Fehler führen. Trotzdem weglassen, die Subshell ist hier ziemlich sicher komplett überflüssig.

    Asrock A75 Pro4-M
    Debian wheezy (testing, stock) (aktuell 2012-08-24: Linux 3.2, VDR 1.7.28)
    vdr-sxfe (xineliboutput)
    Pioneer VSX-520-K

    Einmal editiert, zuletzt von zirias ()

  • Hi, Jungs


    Danke für die Ausführungen !
    Also langsam werd ich immer verwirrter > bin ja noch nicht so bewandert im Scripting.
    Gut also die Klammern () kann ich weglassen > soviel hab ich kapiert.



    Ich meine jetzt sieht das ganze bei mir so aus;


    Code
    # mit 2 Tonspuren (001.ac3 dolby, 001.mpa stereo de oder anderssprachig)
    if [ -e $TARGETDIR/001.mpv ] && [ -e $TARGETDIR/001.ac3 ] && [ -e $TARGETDIR/001.mpa ] && [ ! -e $TARGETDIR/001[1].mpa ]; then
    	$SVDRPSEND -d localhost "MESG ! Demuxen erfolgreich, MPG mit 2 Tonspuren wird erstellt ! " >/dev/null
    	nice -n 15 $TCMPLEX_PANTELTJE -m d -o $TARGETDIR/002.mpg -i $TARGETDIR/001.mpv -0 $TARGETDIR/001.ac3 -1 $TARGETDIR/001.mpa 2>&1 | tee $LOGFILE
    fi


    Da es laut @ziriasi aber besser wäre

    Zitat

    die Option "-a" von test


    statt && zu verwenden soll das dann in etwa wie folgt aussehen oder ?

    Code
    if [ -e $TARGETDIR/001.mpv -a -e $TARGETDIR/001.ac3 -a ! -e $TARGETDIR/001[1].mpa  ]; then
    $SVDRPSEND -d localhost "MESG ! Demuxen erfolgreich, MPG mit 2 Tonspuren wird erstellt ! " >/dev/null
    	nice -n 15 $TCMPLEX_PANTELTJE -m d -o $TARGETDIR/002.mpg -i $TARGETDIR/001.mpv -0 $TARGETDIR/001.ac3 -1 $TARGETDIR/001.mpa 2>&1 | tee $LOGFILE
    fi


    Ich dachte -a und && wäre eigentlich dasselbe ?


    NACHTRAG !
    Jedenfalls funktionieren tun beide Varianten, damit bleib ich nun bei der
    unteren Variante.


    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

    2 Mal editiert, zuletzt von Bert ()

  • Zitat

    Original von Bert
    Ich dachte -a und && wäre eigentlich dasselbe ?


    Absolut nicht. In diesem Fall ist das Ergebnis dasselbe, allerdings ist die Version mit && aufwändiger.


    && ist ein Shell-Operator, a && b weißt die Shell an, b nur auszuführen, wenn a erfolgreich war (return-code 0). Man kann damit also beliebige Kommandos in einem Script logisch verknüpfen, z.B. sowas wie


    grep -q foo bar.conf && echo "found foo!"


    -a ist eine Option für "test" (einfach mal "man test" lesen) und bedeutet, dass test zwei Bedingungen logisch und-verknüpfen soll. Wenn du an der Stelle -a verwendest muss die Shell also nur /einmal/ test starten.

    Asrock A75 Pro4-M
    Debian wheezy (testing, stock) (aktuell 2012-08-24: Linux 3.2, VDR 1.7.28)
    vdr-sxfe (xineliboutput)
    Pioneer VSX-520-K

  • Bullshit geschrieben... sorry

    Powered by Point of View ION330 und Mystique SaTiX-S2 Dual
    Geguckt wird auf einem 52PFL5605H/12 per HDMI mit Atmolight Quattro
    Audio optisch per Yamaha RX-V459 auf einem Teufel Concept P
    Non-TV content über XBMC und boblight
    Remote Harmony 525 durch Atric-IR
    Remote und Streaming mit Motorola XOOM und AndroVDR sowie Daroon Player
    Streaming auf ZBOX ID-81 und Desktop per streamdev
    All based on selfbuild OpenenELEC master


    Nebenbei noch ein par andere VDRs

    Einmal editiert, zuletzt von pinky666 ()

  • Danke Jungs,


    Dann wär das ja nun endlich geklärt.


    Gruss, Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

Jetzt mitmachen!

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