bash if else, wieder mal

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

bash if else, wieder mal

Beitrag von manes » 06.04.2011 21:35:42

hallo forum,
den ganzen abend fummele ich an diesem wenigzeiler rum, (den man bestimmt auch einzeilig hinkriegte, egal) und der mir handliche zip-pakete schnüren soll von verzeichnissen innerhalb des $PWD, aber (im snippet nur) die einzeln liegenden pdf in ruhe lassen soll. ich blicks wieder nicht:

Code: Alles auswählen

(…)if [ -e `find ./ -name "*.flac"` ] ; then
echo "flac gefunden"
zip -rm $"$(find ./* -type d| basename *)" ./*
elif [ -e `find ./ -name "*.mp3"` ] ; then
echo "mp3 gefunden"
zip -rm $"$(find ./* -type d|basename *)" ./*
elif [ -e `find ./ -name "*.pdf"` ] ; then 
echo "pdf"
(…)
fi;(…)
und wie ich es auch anstelle, aktuell nur ordner mit mp3 vorhanden, aber die ausgabe ist "flac gefunden". offenbar findet gar keine prüfung statt. sieht jemand, wo es heute hakt?

grüße
manes

krellaan
Beiträge: 3
Registriert: 05.04.2011 18:53:18

Re: bash if else, wieder mal

Beitrag von krellaan » 06.04.2011 22:11:56

Moin.

Das Programm find gibt bei Erfolg 0 zurück, und wenn find nichts findet einen Wert ungleich 0.
Mit if test auf exists wird das somit an der Stelle so nichts.

Code: Alles auswählen

if find ./ -name *.flac                                                                                                          
     then                                                                        
     echo "found flac"                                                            
fi   

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: bash if else, wieder mal

Beitrag von manes » 06.04.2011 22:22:23

krellaan hat geschrieben:

Code: Alles auswählen

if find ./ -name *.flac                                                                                                          
     then                                                                        
     echo "found flac"                                                            
fi   
danke, krellaan,
leider macht das gar keinen unterschied. gleiche meldung…
grüße
manes

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: bash if else, wieder mal

Beitrag von roli » 06.04.2011 22:50:14

Hi manes,

wie waers denn wenn du das Bash BuildIn "for" nutzen wuerdest:
for name [ [ in [ word ... ] ] ; ] do list ; done
The list of words following in is expanded, generating a list of items. The variable name is set to each element of this list in turn, and list is executed each
time. If the in word is omitted, the for command executes list once for each positional parameter that is set (see PARAMETERS below). The return status is the
exit status of the last command that executes. If the expansion of the items following in results in an empty list, no commands are executed, and the return
status is 0.
Also sowas wie:

Code: Alles auswählen

for file in $(find ./ -name "*.flac")
do
  "add $file to zip file"
done
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

krellaan
Beiträge: 3
Registriert: 05.04.2011 18:53:18

Re: bash if else, wieder mal

Beitrag von krellaan » 06.04.2011 22:53:37

Dann halt mit for ...

Code: Alles auswählen

 #! /bin/bash                                                                                                                    
                                                                                
for datei in `find ./ -name "*.dub" -print 2>/dev/null`                         
do                                                                              
       echo "found dub"                                                        
       break                                                                   
done                                                                            
for datei in `find ./ -name "*.png" -print 2>/dev/null`                         
do                                                                              
         echo "found png"                                                        
         break                                                                   
done     
Uups, da war einer schneller.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: bash if else, wieder mal

Beitrag von newdeb » 07.04.2011 13:56:06

if [ -e `find ./ -name "*.flac"` ] ; then
Der Returncode von find spielt hier überhaupt keine Rolle, da mit Kommandosubstitution gearbeitet wird. Falls find genau eine Datei findet, würde das auch funktionieren. Falls es nichts findet, sieht der Testausdruck so aus (da nicht quotiert):

Code: Alles auswählen

[ -e ]
Der Returncode ist hier tatsächlich 0 (d.h test ergibt true), und zwar deswegen (aus der Bash-Manpage):
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
...
1 argument
The expression is true if and only if the argument is not null.
Der beabsichtigte Vergleich auf File-Existenz findet also in diesem Fall gar nicht statt (wie auch, mangels Argument).

Die "for"-Lösung sollte gut funktionieren (solange die Pfadnamen keine Leerzeichen enthalten 8O)

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: bash if else, wieder mal

Beitrag von manes » 07.04.2011 19:04:06

newdeb hat geschrieben:Die "for"-Lösung sollte gut funktionieren (solange die Pfadnamen keine Leerzeichen enthalten 8O)
jepp, nächster stolperstein.
aaargh, auf der kommandozeile bin ich sowas analphabetisches, es ist zum heulen!
mit den angebotenen hilfen (danke für eure unterstützung!) komme ich aber noch nicht weiter. denn "natürlich" haben die dateinamen leerzeichen. den gezippten paketen nehme ich die auch gerne weg, aber nicht den einzelnen songs/ dokumenten etc.
meine idee/ selbstgestellte aufgabe war/ ist, ich habe ein verzeichnis, da werfe ich dateien/ verzeichnisse rein und per skript wird geguckt, welche dateiformate in den einzelnen verzeichnissen liegen; verzeichnisse oder (abhängig vom format) dateien gezippt, eine textdatei mit dem verzeichnis-/ dateinamen angelegt und der inhalt des verzeichnisses per rsync auf einen anderen rechner gesichert.
demnächst hab ich ein bißchen zeit, da kann ich dann weiter rumprobieren.
grüße
manes

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: bash if else, wieder mal

Beitrag von roli » 07.04.2011 21:37:58

manes hat geschrieben:
newdeb hat geschrieben:Die "for"-Lösung sollte gut funktionieren (solange die Pfadnamen keine Leerzeichen enthalten 8O)
jepp, nächster stolperstein.
Schau dir mal die Manpage von find an, da gibt's u.a.:
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

Find files named core in or below the directory /tmp and delete them, processing filenames in such a way that file or directory names containing single or double quotes, spaces or newlines are correctly handled. The -name test comes before the -type test in order to avoid having to call stat(2) on every file.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Antworten