code review fuer shell script
code review fuer shell script
Hallo,
ich habe eben mein erstes Shell-Script geschrieben:
35101
Sinn des Scripts ist es, alle jpg-Bilder des aktuellen Verzeichnisses mit convert auf eine bestimmte Groesse zu bringen. Die ausgegebenen Bilder sollen in ein zur Laufzeit zu spezifizierendes (zuvor nicht existierendes) Unterverzeichnis gespeichert werden.
Jetzt haette ich gern ein Feedback. Koenntet ihr mich auf Fehler, schlechten Stil etc hinweisen?
Insbesondere hab ich es an einer Stelle nicht geschafft, eine zuvor definierte Variable zu verwenden, anstelle des konkreten Wertes (Zeile 32).
Viele Gruesse,
ben
Edit : Formatierung
ich habe eben mein erstes Shell-Script geschrieben:
35101
Sinn des Scripts ist es, alle jpg-Bilder des aktuellen Verzeichnisses mit convert auf eine bestimmte Groesse zu bringen. Die ausgegebenen Bilder sollen in ein zur Laufzeit zu spezifizierendes (zuvor nicht existierendes) Unterverzeichnis gespeichert werden.
Jetzt haette ich gern ein Feedback. Koenntet ihr mich auf Fehler, schlechten Stil etc hinweisen?
Insbesondere hab ich es an einer Stelle nicht geschafft, eine zuvor definierte Variable zu verwenden, anstelle des konkreten Wertes (Zeile 32).
Viele Gruesse,
ben
Edit : Formatierung
Re: code review fuer shell script
Guten morgen.
Ich habe nicht ganz verstanden für was $SUFFIX in der for-Schleife verwendet werden soll (Zeile 32). Bitte erklär mir das.
Zum Rest vom Script.
Gefällt mir Eventuell würd ich noch eine Prüfung einbauen, ob der Befehl
erfolgreich war und das ganze evtl. sogar in ein Log-File schreiben.
Dann hast Du folgendes gemacht:
Ich würde das so bauen:
Dann brauchst du nämlich nur eine Variable verändern, wenn der Ordner mal anders sein soll.
Ich habe nicht ganz verstanden für was $SUFFIX in der for-Schleife verwendet werden soll (Zeile 32). Bitte erklär mir das.
Zum Rest vom Script.
Gefällt mir Eventuell würd ich noch eine Prüfung einbauen, ob der Befehl
Code: Alles auswählen
${COMMAND} "${file}" ${ARGUMENT} "${filename}"
Dann hast Du folgendes gemacht:
Code: Alles auswählen
...
CUR_DIR=${PWD}
...
GOAL_DIR="${PWD}/$NEW_DIR"
...
Code: Alles auswählen
GOAL_DIR="$CUR_DIR/$NEW_DIR"
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft
Re: code review fuer shell script
Code: Alles auswählen
COMMAND=convert
->
COMMAND=$(which convert)
Code: Alles auswählen
for file in $CUR_DIR/*.jpg
Code: Alles auswählen
$ sh
$ pwd
/tmp/bild
$ SUF=jpg; for file in "$(pwd)"/*.$SUF; do echo $file; done
/tmp/bild/1.jpg
/tmp/bild/2.jpg
/tmp/bild/3.jpg
/tmp/bild/4.jpg
/tmp/bild/5.jpg
/tmp/bild/6.jpg
/tmp/bild/7.jpg
$
Zuletzt geändert von rendegast am 12.11.2010 09:57:12, insgesamt 2-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: code review fuer shell script
Geile Idee. Das hab ich noch nicht so gemacht...rendegast hat geschrieben:Code: Alles auswählen
COMMAND=$(which convert)
Nur. Wenn "convert" nicht existiert sollte das hier auch noch abgefangen werden oder?
EDIT: @rendegast: OK. Das mit which is ne richtig geile Sache. Hab das grad ausprobiert, es gibt nichts zurück wenn der Befehl nicht existiert...
Zuletzt geändert von gbotti am 12.11.2010 09:52:19, insgesamt 2-mal geändert.
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft
Re: code review fuer shell script
es gibt nichts zurück wenn der Befehl nicht existiert...
Code: Alles auswählen
$ which convert
/usr/bin/convert
$ which conver ; echo $?
1
Code: Alles auswählen
[ -x "${COMMAND}" ] || { echo "Error: You must install ${PACKAGE} for this script to work!"; exit 1; }
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: code review fuer shell script
Vielen Dank fuer eure Antworten.
Das mit $SUFFIX hab ich verbockt, ich war wohl zu muede. rendegast macht das, was ich meinte.
Betreffs
Ich habe gelesen, dass die Option set -e zu Beginn eines Scripts guter Stil sei.
Mit dieser Option endet das Script allerdings schon in Zeile a, falls convert nicht gefunden wird. Es kommt in dem Fall nicht die Fehlermeldung von Zeile b.
Um es mit set -e hinzukriegen, wuerde ich gern folgendes machen:
Allerdings funktioniert das nicht, es fehlt vielleicht ein Schalter in [ ... ]. Ausserdem scheint die Variable COMMAND ausserhalb der Klammern nicht zu existieren.
ben
Das mit $SUFFIX hab ich verbockt, ich war wohl zu muede. rendegast macht das, was ich meinte.
Betreffs
Code: Alles auswählen
COMMAND=$(which convert) # a
[ -x "${COMMAND}" ] || { echo "Error: You must install ${PACKAGE} for this script to work!"; exit 1; } # b
Mit dieser Option endet das Script allerdings schon in Zeile a, falls convert nicht gefunden wird. Es kommt in dem Fall nicht die Fehlermeldung von Zeile b.
Um es mit set -e hinzukriegen, wuerde ich gern folgendes machen:
Code: Alles auswählen
PROGRAM=convert
[ COMMAND=$(which "${PROGRAM}") ] || { echo "Failure" ; exit 1 ; }
ben
Re: code review fuer shell script
Code: Alles auswählen
[ COMMAND=$(which "${PROGRAM}") ] ...
in der Form wird getestet, ob "COMMAND=/usr/bin/convert" respektive "COMMAND=" ist.
Wäre also immer war.
Die eigentliche Schreibweise dafür ist
Code: Alles auswählen
[ -n irgendein_String ] ...
Code: Alles auswählen
[ COMMAND = $(which "${PROGRAM}") ] ...
Weiterhin wäre möglich, daß der Test so aussieht:
Code: Alles auswählen
$ [ COMMAND = ] ; echo $?
bash: [: COMMAND: Einstelliger (unärer) Operator erwartet.
2
# Der Test selbst ist fehlerhaft
# Hingegen definiert wäre es mit Quotes:
$ [ COMMAND = "" ] ; echo $?
1
Gemeint ist wohl
Code: Alles auswählen
[ "$COMMAND" = "$(which "${PROGRAM}")" ] ...
Code: Alles auswählen
[ "x$COMMAND" = "x$(which "${PROGRAM}")" ] ...
(jedoch hier schlecht, weil eventuell beide Variablen leer sich könnten,
dann der Test aber ein nichtbeabsichtigtes POSITIV ergibt)
--------------------------------
Quoten ist Tests ist wirklich wichtig, ein Beispiel: [ -x $Variable ]
Code: Alles auswählen
$ [ -x ] ; echo $?
0
# Ein "Nichts" wäre ausführbar? (Das '-x' wird hier wohl wieder als nichtleerer String interpretiert)
# So ist es richtig:
$ [ -x "" ] ; echo $?
1
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: code review fuer shell script
Sorry, ich hab mich unverstaendlich ausgedrueckt. Mein Ziel ist es, das Skript mit der Option "-e" auszufuehren.
Du hattest vorgeschlagen:
Bei Benutzung der Option "-e" (set -e) gibt jedoch schon die Wertzuweisung "1" zurueck, und das Skript endet vorzeitig, ohne die zweite Zeile ueberhaupt auszufuehren. Die Fehlermeldung wird also nie ausgegeben.
Ich wuerde also die erste Zeile gern in einen Fehlerabfang wrappen.
Eine Loesung waere
aber da hab ich zweimal which, was ich gern vermeiden wuerde.
Mein Vorschlag war Unsinn, weil das "=" als Vergleich und nicht als Zuweisung interpretiert wird.
Du hattest vorgeschlagen:
Code: Alles auswählen
COMMAND=$(which convert)
[ -x "${COMMAND}" ] || { echo "Error: You must install ${PACKAGE} for this script to work!"; exit 1; }
Ich wuerde also die erste Zeile gern in einen Fehlerabfang wrappen.
Eine Loesung waere
Code: Alles auswählen
if $(which convert) ; then COMMAND=$(which convert); else Fehlermeldung
Mein Vorschlag war Unsinn, weil das "=" als Vergleich und nicht als Zuweisung interpretiert wird.
Re: code review fuer shell script
Sorry,Bei Benutzung der Option "-e" (set -e) gibt jedoch schon die Wertzuweisung "1" zurueck, und das Skript endet vorzeitig, ohne die zweite Zeile ueberhaupt auszufuehren. Die Fehlermeldung wird also nie ausgegeben.
Dazu, das 'set -e' muß ja nicht immer vorne stehen, zBsp /etc/init.d/binfmt-support:
und dann gibt es noch dieses niedliche, /etc/init.d/dovecot:Code: Alles auswählen
... ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin NAME=binfmt-support DESC="additional executable binary formats" if [ "$(uname)" != Linux ]; then exit 0 fi which update-binfmts >/dev/null 2>&1 || exit 0 . /lib/lsb/init-functions [ -r /etc/default/rcS ] && . /etc/default/rcS set -e CODE=0 ...
Code: Alles auswählen
... # Do NOT "set -e" ...
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: code review fuer shell script
Manche behaupten sogar, die Benutzung sei generell zu vermeiden:rendegast hat geschrieben:Dazu, das 'set -e' muß ja nicht immer vorne stehen
http://bugs.debian.org/139969
Nochmals Danke fuer eure Geduld und Hilfe.
ben