Aus Linux-Magazin 11/2009

Shellskripte aus der Stümper-Liga - Folge 2: Quoting (Seite 2)

if [ x$var = "xabc" ]; then

bekannt, dort mussten Entwickler in der BAT-Sprache so programmieren. Für die moderne Shell ist das aber nicht notwendig und unelegant. Das gilt auch für:

if [ -z ${DISPLAY:=""} ]; then

Ist die Variable »$DISPLAY« leer oder nicht gesetzt, weist ihr die Shell per »:=«-Modifier einen Leerstring zu. Anschließend prüft die Bash das Ergebnis mit der Testoption »-z«, ob es leer ist. Einfacher und verständlicher ist:

if [ -z "$DISPLAY" ]; then

Im Grunde sollten Entwickler nur auf Quotes verzichten, um zu vermeiden, leere Argumente zu erzeugen. Denn die Bash macht aus Variablenreferenzen in Quotes mindestens einen Leerstring:

cat $a $b $c
cat "$a" "$b" "$c"

Im ersten Fall gibt »cat« bis zu drei Dateien aus, im zweiten Fall erhält das Programm immer drei Parameter.

Quotes innerhalb Quotes

Zwei einfache Regeln bestimmen die Wirkung von Sonderzeichen innerhalb von Quotes: Innerhalb Singlequotes darf kein einfaches Hochkomma vorkommen, auch kein per Backslash entwertetes (siehe Abbildung 1). In doppelten Anführungszeichen ist dies indes erlaubt:

Abbildung 1: Meist entwerten vorangestellte Backslashes ein Sonderzeichen, die Bash erlaubt aber nicht jede Form von Quotes innerhalb von Quotes.

Abbildung 1: Meist entwerten vorangestellte Backslashes ein Sonderzeichen, die Bash erlaubt aber nicht jede Form von Quotes innerhalb von Quotes.

myvar="Ein Zitat: "Text ...""

Ein Backslash maskiert dabei auch andere Sonderzeichen, zum Beispiel das Dollarzeichen zum Dereferenzieren von Variablen oder einen weiteren Backslash. Das in die Bash eingebaute Kommando »printf« hilft in kritischen Fällen:

printf -v myvar %q 'Ein Zitat: "Text ..."'
echo "$myvar"

Die Formatangabe »%q« sorgt für das korrekte Quoting.

Zweite Runde

Eval ist ein Shell-internes Kommando und sehr mächtig. Es sorgt dafür, dass die Shell eine Zeile ein zweites Mal auswertet. Geschicktes Quoting macht es dabei möglich, dass der Kommando-Interpreter beispielsweise Variablen erst beim zweiten Durchlauf auswertet:

rmcmd="rm"; eval $rmcmd "$@"

Das sieht obskur aus, hat aber den großen Vorteil, dass der Programmierer während der Entwicklungs- und Testphase kritische Kommandos durch ein einfaches Umdefinieren von »rmcmd«, zum Beispiel auf »echo«, gefahrlos ausführen kann. Ohne Quotierung löst schon der erste Durchlauf die Variable auf und entfernt die Anführungszeichen. Der »rm«-Befehl sieht dann nur noch ein Argument.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 2 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben