[linux-l] Bash: Handling von Kommentaren und Leerzeilen in Config-Files

Steffen Dettmer steffen at dett.de
Di Mai 13 15:41:19 CEST 2003


* Dani Oderbolz wrote on Tue, May 13, 2003 at 13:12 +0200:
> Nur bin ich nun bezüglich " eitwas verwirrt,
> ich dachte das sei in einer Test-Expression nicht nötig?
> Wann brauch ich denn " und wann nicht??

Zusätzlich zu Jan's prima Erklärung noch ein Beispiel:

a=1
b=1
if [ $a == $b ] ; then
	echo a=b;
fi

Das funktioniert nur genau dann, wenn a und b einfache Werte,
also Zahlen oder ein Wort, enthalten. Wenn z.B. a und b nicht
definiert sind, steht da ja:

a=1
if [ 1 ==  ] ; then
	echo a=b;
fi

Das ist syntaktisch falsch und gibt einen Fehler. Nach "[ " soll
ein Ausdruck stehen, der unterm Strich unär ist. "bash -x" zeigt
das auch:

+ a=1
+ '[' 1 == ']'
./x.sh: [: 1: unary operator expected

Schreibt man jedoch:

a=1
if [ "$a" == "$b" ] ; then
	echo a=b;
fi

steht da dann (wenn a und b nicht definiert sind)

if [ "1" == "" ] ; then
	echo a=b;
fi

und das funktioniert (der Ausdruck ist falsch --> kein echo, aber
auch kein Fehler).

Interessant ist auch:

a="*"
echo a: $a
echo "a $a"

Das erste echo gibt eine Dateiliste aus (was auf * matcht), der
zweite gibt ein Stern aus. Das ist auch bei if-Konstrukten so.
Also hier auch quoten. Regel: eine "$" Variable darf nur einen
Dateinamen enthalten. Schreibt man

a="datei1 datei2"
touch $a

klappt das zwar, aber bei Leerzeichen muß man schreiben:

a="ein dateiname mit leerzeichen"
touch "$a"

Also kann man nicht auf diese Art mehrere Dateien bearbeiten, wenn
möglicherweise (!) ein Leerzeichen drin ist (Jan's Beispiel).
Dann schreibt man sowas wie:

for file in * ; do
	echo "$file";
	touch "$file";
done

das geht dann auch mit Leerzeichen, weil gequotet. Ist ja laut
der Regel, weil $file immer genau einen Dateinamen enthält.

Also kurz: mit quoten ist man auf der sicheren Seite.

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.




Mehr Informationen über die Mailingliste linux-l