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





