Dies war Teil eines Fetchmail-Daemon-Skripts.
if [ ! "x$START_DAEMON" = "xyes" -a ! "$1" = "status" ]; then
Was ist der Sinn der Verwendung x$START_DAEMON = "xyes"
; warum nicht einfach benutzen $START_DAEMON = "yes"
?
Dies war Teil eines Fetchmail-Daemon-Skripts.
if [ ! "x$START_DAEMON" = "xyes" -a ! "$1" = "status" ]; then
Was ist der Sinn der Verwendung x$START_DAEMON = "xyes"
; warum nicht einfach benutzen $START_DAEMON = "yes"
?
Antworten:
Ich habe Fälle gesehen , wo das x$variable
war nicht zitiert, und in diesem Fall ist es Situationen zu umgehen , wo die Variable ( $START_DAEMON
in diesem Fall) leer sein könnte. Andernfalls würde Ihr Test prüfen, ob ! = "yes"
und der Test würde fehlschlagen. Wie Sie bereits in den Kommentaren erwähnt haben, wird dies durch doppelte Anführungszeichen erledigt x$variable
.
Andererseits führte mich eine Frage zu ServerFault zu dieser Seite: http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html , wobei verhindert wird, dass die Variablenerweiterung mit einem möglicherweise verwirrenden Zeichen beginnt [
odertest
Trotzdem denke ich, dass dies ein Problem ist, das möglicherweise nur in älteren Shells ("Historisch", wie auf der Opengroup-Seite angegeben) ein Problem darstellt und dass neuere Implementierungen das Richtige ohne das x
tun, solange es sich zumindest um doppelte Anführungszeichen handelt . Es kann sich also in erster Linie um eine Codierungstradition handeln. Ich konnte jedoch ein Problem mit /bin/sh
SunOS 5.10 bestätigen :
# a="!"; [ "$a" = "yes" ] && echo ok
test: argument expected
x$variable
nicht zitiert wurde, und es können Situationen gewesen sein, in denen Probleme mit test
aufgetreten sind. Die Verwendung eines bekannten Zeichens wie x
verhindert jedoch andere Probleme mit Sonderzeichen - ich werde die Antwort aktualisieren.
bash: !: event not found
mit Ihrem veröffentlichten Beispiel, vermeidet jedoch die Erweiterung des Verlaufs und funktioniert a=\!; [[ "$a" = "yes" ]] && echo ok
stattdessen einwandfrei .
test
Ausdrücke bis zu drei Token vor, wie z. B. diesen. Historische Bourne-Muscheln sind fehlerhaft. Das x
Präfix macht das Parsen von links nach rechts eindeutig. Die doppelten Anführungszeichen sind in jeder Shell erforderlich, falls der Wert der Variablen leer ist, Leerzeichen enthält usw. Die doppelten Anführungszeichen sind nicht erforderlich. Dies [[…]]
ist eine spezielle Syntax, nicht nur ein eingebautes Dienstprogramm wie [
.
unset a;[ "$a" = "yes" ] && echo ok
das meldet keinen Fehler, hmm