bash: if - Konstrukt verbogen ?

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von r00ki3, 01.07.2005.

  1. #1 r00ki3, 01.07.2005
    Zuletzt bearbeitet: 01.07.2005
    r00ki3

    r00ki3 Jungspund

    Dabei seit:
    29.06.2005
    Beiträge:
    20
    Zustimmungen:
    0
    Ich hoffe ich nerve nicht, aber nach stundenlanger Trüffelei innerhalb Google und eines dicken Papier - Schinkens zur bash fällt mir nichts mehr ein, als mich erneut an Euch zu wenden.

    Folgendes Skript....

    cat /usr/bin/paycipher/key.id | while
    read key smtp
    do
    for dump in `find /usr/bin/paycipher/$key -follow -mmin +1 -iname "*.bak"`
    if [ "$dump" == "" ] ; then
    exit 0
    else
    gpg -v -r $key --multifile --encrypt --yes $dump
    # Quelldateien löschen
    rm -rf $dump
    fi
    done
    exit 0


    fällt auf die Nase mit
    paycipher: [..] syntax error near unexpected token `if'
    Hier wird geprüft, ob $dump leer ist ( also find nichts zurückgibt ).
    Wenn das der Fall ist, soll das Skript aussteigen --> exit 0.
    Falls $dump nicht leer ist, soll die whileDo - Schleife laufen.

    Obwohl die Reihenfolge von if .. then .. else . .while .. do .. fi .. done
    eigentlich passen müßte. Ich bin mir sicher es ist irgendeine winzige
    Kleinigkeit....aber bin halt Anfänger....

    --> schonmal vielen Dank !

    Daniel
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 MrFenix, 01.07.2005
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    Glaube du kannst so nicht prüfen, ob der string leer ist.
    if [ -n "$dump" ] müsste klappen
     
  4. r00ki3

    r00ki3 Jungspund

    Dabei seit:
    29.06.2005
    Beiträge:
    20
    Zustimmungen:
    0
    Das tuts leider auch nicht....nothing checks out :-(

    Daniel
     
  5. #4 neutrino1, 01.07.2005
    neutrino1

    neutrino1 Mitglied

    Dabei seit:
    03.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Hi!

    Zuerst einmal: du machst eine for-schleife, für die es kein "do" und "done" gibt. Also:

    Code:
    for dump in `find /usr/bin/paycipher/$key -follow -mmin +1 -iname "*.bak"`[B];do[/B]
       if [ "$dump" == "" ] ; then
          exit 0
       else
          gpg -v -r $key --multifile --encrypt --yes $dump
          rm -rf $dump
       fi
    [B]done[/B]
    
    Außerdem glaub ich, daß du das if-then-else nicht brauchst, denn wenn das for nix liefert, spingt es eh hinter das done.

    Ciao
     
  6. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    IMHO ist es -z (so nebenbei) ansonsten "man test".

    Ansonsten stimme ich Neutrino zu. Wenn er nix findet, dann springt er zum nächsten Resultat.
     
  7. r00ki3

    r00ki3 Jungspund

    Dabei seit:
    29.06.2005
    Beiträge:
    20
    Zustimmungen:
    0
    Hallo Tr0nix, hallo Neutrino,


    Das funzt soweit, vielen herzlichen Dank. Ich versuche nun, mittels einer
    elif - Schleife Suffix - Unterscheidungen bei den Dumps zu realisieren und habe
    folgendes gemacht:

    cat /usr/bin/paycipher/key.id | while
    read key smtp
    do
    for dump in `find /usr/bin/paycipher/$key -follow -mmin +1 -iname "*.???"`
    do

    if [ "$dump" == "" ] ; then
    exit 0

    elif
    [ "$dump" == "*.gpg" ] ; then
    exit 0

    elif
    [ "$dump" == "*.bak" ] ; then
    gpg -v -r $key --multifile --encrypt --yes $dump
    exit 0
    rm -rf $dump

    elif
    [ "$dump" == "*.pdf" ] ; then
    gpg -v -r $key --multifile --encrypt --yes $dump
    rm -rf $dump

    else
    echo Beendet.
    fi
    done
    done

    Das Ergebnis sind "Beendet" - Echos in der Anzahl der gefundenen Dumps, verschlüsselt wird allerdings nichts. Die $dump - Variable wird jedoch korrekt gefüllt ( nach einem testweisen echo $dump überprüft ); irgendwo scheint innerhalb der elif - Schleifen nicht auf die Suffixe unterschieden zu werden.
    Kann da nochmal jemand draufschauen ?

    Oder ist es cleverer, innerhalb der key.id einen weiteren String lesen zu lassen und diesen dem find als exp mitzugeben ?

    Daniel
     
  8. #7 neutrino1, 05.07.2005
    neutrino1

    neutrino1 Mitglied

    Dabei seit:
    03.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Hi!

    Grundsätzlich:
    test ... externes Kommando
    [[ ]] ... build in (daher besser, schneller)

    test macht fast das gleiche wie [[ ]], da aber [[ ]] von der shell bearbeitet wird, gibts dann doch Unterschiede.
    Für dich heißt das, daß du den rechten Ausdruck (das Muster) nicht unter doublequotes setzten darfst, da sonst der * auch als * interpretiert wird:

    Code:
    prompt> [[ "testfile5.bak" == "*bak" ]];echo $?
    1
    prompt> [[ "testfile5.bak" == *bak ]];echo $?
    0
    Ciao
     
  9. r00ki3

    r00ki3 Jungspund

    Dabei seit:
    29.06.2005
    Beiträge:
    20
    Zustimmungen:
    0
    Hallo Neutrino,

    schade, funktioniert leider nicht. Ich mach bestimmt noch irgendwas falsch.
    Um es zusammenzufassen: Ich möchte mit

    find /usr/bin/paycipher/$key -follow -mmin +1 -iname "*.*"

    alle Files finden und anhand der Endungen der Ergebnisse mittels if / elif
    bestimmte Aktionen auslösen.

    Hilfst mir nochmal aufs Fahrrad ? ;-)

    Danke
    Daniel
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 neutrino1, 06.07.2005
    neutrino1

    neutrino1 Mitglied

    Dabei seit:
    03.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Hi!

    Deine komplette Konstruktion sieht seltsam aus. Ich nehm mal an, $dump kann mehrere Ergebnisse zurückliefern, dieses script wird aber nur das erste verarbeiten, da es ja immer mit "exit 0" nach dem ersten Treffer aussteigt.
    Wenn also mehrere Ergebnisse in $dump sind, das erste ist aber ein "*gpg", dann steigt das script mit "exit 0" aus undverarbeitet alle anderen Treffer nicht mehr. Beim "*bak"-file steigt es sogar aus, bevor es $dump löscht. Wenn es z.B. ein "*txt"-file findet, dann gibt es ein "Beendet" aus und verarbeitet die restlichen Treffer auch nicht.
    Ist das alles so gewollt? Wahrscheinlich nicht.
    D.h. das ganze sollte sinngemäß so aussehen:
    Code:
    for dump in `find . -name "file*"`
    	do
    	printf "file: %s: " $dump
    	if 	[[ "$dump" == *gpg ]] ; then echo "GPG"
    	elif 	[[ "$dump" == *bak ]] ; then echo "BAK"
    	elif 	[[ "$dump" == *pdf ]] ; then echo "PDF"
    	else 	echo "passt auf kein Muster."
    	fi
    done
    echo "Beendet"
    exit 0
    Der output sieht dann z.B. so aus:
    Code:
    file: ./file1.bak: BAK
    file: ./file2.bak: BAK
    file: ./file3.gpg: GPG
    file: ./file4.pdf: PDF
    file: ./file5.pdf: PDF
    file: ./file6.txt: passt auf kein Muster.
    file: ./file7.xls: passt auf kein Muster.
    Beendet
    Besser noch ist es, statt den if-Konstrukten eine case-Anweisung zu verwenden:

    Code:
    for dump in `find . -name "file*"`;do
    	printf "file: %s: " $dump
    	case $dump in
    	*gpg|*txt)echo "GPG oder TXT";;
    	     *bak)echo "BAK";;
    	     *pdf)echo "PDF";;
    	        *)echo "passt auf kein Muster.";;
    	esac
    done
    echo "Beendet"
    exit 0
    Wie du bei *gpg|*txt sehen kannst, kann man mehrere Muster (durch | getrennt) angeben, wenn danach die selben Aktionen gesetzt werden.

    Ciao
     
  12. r00ki3

    r00ki3 Jungspund

    Dabei seit:
    29.06.2005
    Beiträge:
    20
    Zustimmungen:
    0
    Danke

    Hallo Neutrino,

    Läuft !!!!!
    Ich bin halt Anfänger und die Bash ist extrem mächtig. Ich finds äußerst positiv wie hier Leuten geholfen wird. Ich bin auch in anderen Foren aktiv; vorzugsweise Netzwerke ( Cisco / Juniper / Nortel ) ), das ist ähnlich komplex und etwas krude....da gibts auch viele Anfängerfragen, und nach 5 Jahren unter IOS gerät manches zur Selbstverständlichkeit, was Anfänger nicht wissen. Ergo, was die bash angeht: ich weiß wie anstrengend ich bin :-))

    Nochmals herzlichen Dank für Deinen Input,

    Daniel
     
Thema:

bash: if - Konstrukt verbogen ?

Die Seite wird geladen...

bash: if - Konstrukt verbogen ? - Ähnliche Themen

  1. Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

    Bräuchte Hilfe bei Backupscript mittels Bash und cronjob: Es soll für bestimmte Ordner Archivierung aller Dateien(Logfiles), die älter als 30 Tage sind machen. Am besten einmal täglich nachts irgendwann....
  2. Bashscript aus Debian6 läuft nicht auf Debian7

    Bashscript aus Debian6 läuft nicht auf Debian7: Hallo an alle, nachdem ich ein Skript von squeeze auf wheezy kopiert habe und ausführte, erschienen gleich wilde Fehlermeldungen, nach denen ich...
  3. Bash sucht neues Logo

    Bash sucht neues Logo: Die GNU Bourne Again Shell (bash) sucht nach knapp 20 Jahren ein neues, individuelles Logo. Alle Anwender und Interessenten sind deshalb...
  4. Mit bash Skript bestimmte Werte aus Tabelle lesen

    Mit bash Skript bestimmte Werte aus Tabelle lesen: Hallo! Ich beschäftige mich erst seit Kurzem mit bash und bin deshalb noch nicht so fit darin. Und nun habe ich schon ein kleines Problem und...
  5. Bash: Geteiltes Fenster mit unterschiedlichen Funktionen

    Bash: Geteiltes Fenster mit unterschiedlichen Funktionen: Hallo Leute, ist es in Bash möglich, zwei Funktionen in zwei getrennten Teilen eines Terminalfensters ablaufen zu lassen? Da Bash die Befehle...