bash: if - Konstrukt verbogen ?

R

r00ki3

Jungspund
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
 
Zuletzt bearbeitet:
Glaube du kannst so nicht prüfen, ob der string leer ist.
if [ -n "$dump" ] müsste klappen
 
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
 
MrFenix schrieb:
Glaube du kannst so nicht prüfen, ob der string leer ist.
if [ -n "$dump" ] müsste klappen
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.
 
Hallo Tr0nix, hallo Neutrino,

tr0nix schrieb:
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.


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
 
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
 
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
 
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
 
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
 

Ähnliche Themen

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

Shell Skript beschleunigen

[Erledigt] Shell-Skript lässt sich nicht mit Cron ausführen

Zurück
Oben