[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