ubuntuusers.de

Bash Script Funktion abbrechen und neue starten (ähnlich goto)

Status: Gelöst | Ubuntu-Version: Kubuntu 8.04 (Hardy Heron)
Antworten |

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Entschuldige, mir ist ein Fehler unterlaufen. Es muss natürlich ein Fehlercode zurückgegeben werden, wenn der Aufruf des Dialogs fehlschlägt. Eine Möglichkeit ist es, den Fehlercode explizit anzugeben:

1
2
3
4
if ! DATEI=$(/usr/bin/$DIALOG --title "Aufzuteilende PDF-Datei auswählen" --getopenfilename "$USERPFAD"); then
    return 1
fi
blablabla...

Die andere Möglichkeit (die ich schöner finde) ist, auszunutzen, dass return ohne Argumente den Rückgabewert des letzten Befehls zurückgibt:

1
2
3
4
5
if DATEI=$(/usr/bin/$DIALOG --title "Aufzuteilende PDF-Datei auswählen" --getopenfilename "$USERPFAD"); then
    blablabla...
else
    return
fi

Das ist insbesondere dann praktisch, wenn man den Fehlercode des zuletzt aufgerufenen Befehls erhalten will. Beispielsweise gibt grep 0 zurück, wenn es Treffer gab, 1, wenn es keine Treffer gab und 2, wenn eine Datei nicht geöffnet werden konnte.

darklord

(Themenstarter)
Avatar von darklord

Anmeldungsdatum:
10. April 2007

Beiträge: 235

Ah super ☺

Jetzt läuft es, so wie es gedacht war und mit sauberen Funktionsbearbeitungen!

Vielen vielen Dank für Eure Hilfe 👍

Gruß Dark

Anbei das fertige Script:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#! /bin/bash

USERPFAD="/home/$USER"

if [ -f "$(which kdialog)" ]; then
	DIALOG=kdialog
else
	if [ -f "$(which zenity)" ]; then
		DIALOG=zenity
	else
		DIALOG=gdialog
	fi
fi

which pdftk pdfimages > /dev/null
if [ $? -eq 1 ]; then
	if /usr/bin/$DIALOG --title "Paketabhängigkeit" --warningcontinuecancel "Es muss mindestens ein fehlendes Paket installiert werden!"; then
		konsole -e sudo apt-get install pdftk xpdf-utils
		which pdftk pdfimages pdfcrack > /dev/null
		if [ $? -eq 1 ]; then
			/usr/bin/$DIALOG --error "Fehler beim installieren des Paketes!\n Bitte manuell überprüfen, ob pdftk und pdfimages installiert sind und ggf. installieren."
		exit;
		fi
	else
		exit;
	fi
fi

function hauptprogramm {
while AKTION=$(/usr/bin/$DIALOG --title "PDF Bearbeitung" --menu "Aktion auswählen:                          " pdfjoin "PDF zusammenfügen" pdfburst "PDF aufteilen" pdfturn "PDF drehen" pdfdecrypt "PDF entschlüsseln" pdfcrypt "PDF verschlüsseln" pdfimages "Bilder extrahieren")  && ! $AKTION
do
	true
done
}

function pdfjoin {
while true; do
	if ! PFAD=$(/usr/bin/$DIALOG --title "Ordner mit den zusammenzufügenden PDF-Dateien wählen" --getexistingdirectory "$USERPFAD"); then
		return 1
	fi
	ANZAHL=$(ls "$PFAD"/*.pdf | wc -l)
	if [ $ANZAHL == 1 ]; then
		/usr/bin/$DIALOG --error "In dem Ordner befindet sich nur eine PDF-Datei!"
		continue
	elif [ $ANZAHL == 0 ]; then
		/usr/bin/$DIALOG --error "In dem Ordner befinden sich keine PDF-Dateien!"
		continue
	fi
	if ! SPEICHERN=$(/usr/bin/$DIALOG --title "Speichern unter" --getsavefilename "$USERPFAD" *.pdf); then
		continue
	fi
	break
done
cd "$PFAD"
pdftk *.pdf cat output "$SPEICHERN"
exit
}

function pdfburst {
while true; do
	if ! DATEI=$(/usr/bin/$DIALOG --title "Aufzuteilende PDF-Datei auswählen" --getopenfilename "$USERPFAD"); then
		return 1
	fi
	if [ $(pdfinfo "$DATEI" | grep Pages | head -6 | tail -1 | awk '{print $2}') == 1 ]; then
		/usr/bin/$DIALOG --error "Die ausgewählte PDF-Datei hat nur eine Seite, aufteilen ist nicht möglich!"
		continue
	fi
	if ! SPEICHERN=$(/usr/bin/$DIALOG --title "Wo sollen die einzelnen PDF-Dateien erstellt werden?" --getexistingdirectory "$USERPFAD"); then
		continue
	fi
	break
done
cd "$SPEICHERN"
pdftk "$DATEI" burst
rm doc_data.txt
exit
}

function pdfturn {
while true; do
	if ! DATEI=$(/usr/bin/$DIALOG --title "Zu drehende PDF-Datei auswählen" --getopenfilename "$USERPFAD" *.pdf); then
		return 1
	fi
	if ! DREHEN=$(/usr/bin/$DIALOG --title "PDF drehen" --menu "Wie soll gedreht werden?" A1L "90° Linksdrehung" A1R "90° Rechtsdrehung" A1D "180° Drehung"); then
		continue
	fi
	if ! SPEICHERN=$(/usr/bin/$DIALOG --title "Speichern unter" --getsavefilename "$USERPFAD" *.pdf); then
		continue
	fi
	pdftk A="$DATEI" cat $DREHEN output "$SPEICHERN"
	if [ $? -eq 1 ]; then
		/usr/bin/$DIALOG --error "Start- und Zieldatei sind identisch!\n Bitte unter einem anderen Namen speichern."
		continue;
	fi
	break
done
exit
}

function pdfdecrypt {
while true; do
	if ! DATEI=$(/usr/bin/$DIALOG --title "Passwortgeschütze PDF auswählen - Passwort muss bekannt sein!" --getopenfilename "$USERPFAD" *.pdf); then
		return 1
	fi
	if ! PASSWORT=$(/usr/bin/$DIALOG --title "Passwort entfernen" --password "Bitte geben Sie das Passwort der PDF-Datei ein:"); then
		continue
	fi
	if ! SPEICHERN=$(/usr/bin/$DIALOG --title "Speichern unter" --getsavefilename "$USERPFAD" *.pdf); then
		continue
	fi
	pdftk "$DATEI" input_pw "$PASSWORT" output "$SPEICHERN"
	if [ $? -eq 1 ]; then
		/usr/bin/$DIALOG --error "Start- und Zieldatei sind identisch!\n Bitte unter einem anderen Namen speichern."
		continue
	fi
	break
done
exit
}

function pdfcrypt {
while true; do
	if ! DATEI=$(/usr/bin/$DIALOG --title "PDF auswählen, die verschlüsselt  werden soll" --getopenfilename "$USERPFAD" *.pdf); then
		return 1
	fi
	if ! PASSWORT=$(/usr/bin/$DIALOG --title "Besitzer-Passwort hinzufügen" --password "Bitte geben Sie das gewünschte Passwort ein:"); then
		continue
	fi
	USERPASSWORT=""
	if /usr/bin/$DIALOG --title "Passwortschutz" --yesno "Soll ein Passwort zum öffnen der PDF-Datei erforderlich sein?"; then
		if ! PASSWORT2=$(/usr/bin/$DIALOG --title "Benutzer-Passwort hinzufügen" --password "Bitte geben Sie das gewünschte Passwort ein:"); then
			continue
		fi
	USERPASSWORT="user_pw $PASSWORT2"
	fi
	if ! OPTIONEN=$(/usr/bin/$DIALOG --title "PDF Optionen" --separate-output --checklist "Bitte auswählen, wenn was in der PDF-Datei erlaubt sein soll:" "allow Printing" "Drucken" off "allow ModifyContents" "Inhalt verändern" off "allow CopyContents" "Inhalt kopieren" off "allow ModifyAnnotations" "Kommentare hinzufügen" off); then
		continue
	fi
	if ! SPEICHERN=$(/usr/bin/$DIALOG --title "Speichern unter" --getsavefilename "$USERPFAD" *.pdf); then
		continue
	fi
	pdftk "$DATEI" output "$SPEICHERN" owner_pw $PASSWORT $USERPASSWORT $OPTIONEN
	if [ $? -eq 1 ]; then
	/usr/bin/$DIALOG --error "Start- und Zieldatei sind identisch!\n Bitte unter einem anderen Namen speichern."
		continue
	fi
	break
done
exit
}

function pdfimages {
while true; do
	if ! DATEI=$(/usr/bin/$DIALOG --title "PDF-Datei auswählen, aus welcher die Bilder extrahiert werden sollen" --getopenfilename "$USERPFAD" *.pdf); then
		return 1
	fi
	if ! SPEICHERN=$(/usr/bin/$DIALOG --title "Wo sollen die Bilder gespeichert werden?" --getexistingdirectory "$USERPFAD"); then
		continue
	fi
	break
done
pdfimages "$DATEI" "$SPEICHERN"/
exit
}

hauptprogramm

exit 0

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

  • $USERPFAD ist unnötig, es gibt bereits $HOME (und nebenbei kann ein Nutzer sein Homeverzeichnis auch durchaus woanders haben)

  • $DIALOG kann man auch eleganter ermitteln:

for DIALOG in kdialog zenity gdialog; do
    if which $DIALOG; then
        break
    fi
done
: ${DIALOG:?"no dialog program found"}
  • warum rufst Du immer /usr/bin/$DIALOG auf? Erstens weißt Du nicht, ob das Programm immer unter /usr/bin liegt, zweitens ist es ohnehin nutzlos, da which ja anhand von $PATH die Existenz eines Befehls prüft und das Programm auch ohne Pfad gefunden würde.

darklord

(Themenstarter)
Avatar von darklord

Anmeldungsdatum:
10. April 2007

Beiträge: 235

Hallo World ☺

Ich weiss, dass es $HOME gibt und $USERPFAD _eigentlich_ nicht gebraucht wird, jedoch macht es in meinem Programm durchaus Sinn, da ich die Möglichkeit haben wollte, ein "Stammverzeichnis" für das Script festzulegen, welches bei Ordner-/Dateiwahldialogen immer geöffnet wird. Ich habe z.B. da meinen Download-Ordner eingetragen... aber danke für den Hinweis!

Die elegantere Dialog-Prüfung ist super, werd ich gleich einbauen :-p

Gruß Dark

Antworten |