Was bringt es, hier "x $ START_DAEMON" = "xyes" zu verwenden? (das führende x)


7

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:


8

Ich habe Fälle gesehen , wo das x$variablewar nicht zitiert, und in diesem Fall ist es Situationen zu umgehen , wo die Variable ( $START_DAEMONin 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 xtun, 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/shSunOS 5.10 bestätigen :

 # a="!"; [ "$a" = "yes" ] && echo ok
 test: argument expected

unset a;[ "$a" = "yes" ] && echo okdas meldet keinen Fehler, hmm
Gänseblümchen

Du hast Recht. Ich habe Fälle gesehen, in denen x$variablenicht zitiert wurde, und es können Situationen gewesen sein, in denen Probleme mit testaufgetreten sind. Die Verwendung eines bekannten Zeichens wie xverhindert jedoch andere Probleme mit Sonderzeichen - ich werde die Antwort aktualisieren.
Lars Rohrbach

1
Es kann sich auch um ein Shell-Zitat handeln. Zum Beispiel beschwert sich Bash 4.2.24 bash: !: event not foundmit Ihrem veröffentlichten Beispiel, vermeidet jedoch die Erweiterung des Verlaufs und funktioniert a=\!; [[ "$a" = "yes" ]] && echo okstattdessen einwandfrei .
CodeGnome

POSIX schreibt das Parsen aller korrekten testAusdrücke bis zu drei Token vor, wie z. B. diesen. Historische Bourne-Muscheln sind fehlerhaft. Das xPrä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 [.
Gilles 'SO - hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.