Anführungszeichen verhindern "Wortteilung". Das heißt: Unterteilen von Variablen in mehrere Elemente mit Leerzeichen (oder genauer gesagt mit Leerzeichen, Tabulatoren und Zeilenumbrüchen, wie im Wert der Standard- $IFS
Shell-Variablen definiert).
Beispielsweise,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
Hier definieren wir die howmany
Funktion, mit der wir nur wissen, wie viele Positionsparameter angegeben sind. Wie Sie sehen, werden zwei Elemente an die Variable übergeben, und mit den Anführungszeichen wird der Text in der Variablen als eine Einheit behandelt.
Dies ist wichtig für die korrekte Weitergabe von Informationen. Wenn die Variable beispielsweise den Pfad zur Datei enthält und der Dateiname an einer beliebigen Stelle im Pfad Leerzeichen enthält, schlägt der auszuführende Befehl möglicherweise fehl oder liefert ungenaue Ergebnisse. Wenn wir versuchen würden, eine Datei mit der $var
Variablen touch $var
zu erstellen , würden wir zwei Dateien erstellen, aber touch "$var"
nur eine.
Gleiches gilt für deinen [ "$currentoutput" != "$lastoutput" ]
Teil. Dieser spezielle Test führt einen Vergleich mit zwei Zeichenfolgen durch. Wenn der Test ausgeführt wird, muss der [
Befehl drei Argumente anzeigen - eine Textzeichenfolge, den !=
Operator und eine andere Textzeichenfolge. Wenn Sie doppelte Anführungszeichen verwenden, wird die Wortteilung verhindert, und der [
Befehl erkennt genau diese drei Argumente. Was passiert nun, wenn Variablen nicht in Anführungszeichen gesetzt sind?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
Hier tritt Wort Spaltung und stattdessen [
sieht zwei Saiten hello
und world
gefolgt von !=
, gefolgt von zwei anderen Saiten hi world
. Entscheidend ist, dass der Inhalt von Variablen ohne doppelte Anführungszeichen als separate Einheiten und nicht als ein ganzes Element verstanden wird.
Das Zuweisen der Befehlsersetzung erfordert keine doppelten Anführungszeichen wie in
var=$( df )
wo Sie die df
Ausgabe des Befehls gespeichert haben var
. Es ist jedoch eine gute Angewohnheit, Variablen und Befehlsersetzungen immer in doppelte Anführungszeichen zu setzen, es sei $(...)
denn, Sie möchten, dass die Ausgabe als separate Elemente behandelt wird.
Nebenbei bemerkt, die
while [ true ]
Teil kann sein
while true
[
ist ein Befehl, der seine Argumente auswertet und [ whatever ]
immer wahr ist, unabhängig davon, was sich darin befindet. Im Gegensatz dazu while true
wird der Befehl verwendet, true
der immer den Status "Erfolgreich beendet" zurückgibt (und genau das while
benötigt die Schleife). Der Unterschied ist ein bisschen mehr Klarheit und weniger Tests durchgeführt. Alternativ könnten Sie auch :
anstelle von verwendentrue
Die doppelten Anführungszeichen zum echo "" date and Time
Teil könnten wahrscheinlich entfernt werden. Sie fügen lediglich eine leere Zeichenfolge ein und fügen der Ausgabe zusätzlichen Speicherplatz hinzu. Wenn Sie dies wünschen, können Sie sie dort aufbewahren, aber in diesem Fall gibt es keinen bestimmten funktionalen Wert.
lsusb >> test.log
Dieser Teil könnte wahrscheinlich durch ersetzt werden echo "$currentoutput" >> test.log
. Es gibt keinen Grund, lsusb
erneut zu starten , nachdem es bereits in ausgeführt wurde currentoutput=$(lsusb)
. In Fällen, in denen nachgestellte Zeilenumbrüche
in der Ausgabe beibehalten werden müssen, kann der Wert durch mehrmaliges Ausführen eines Befehls angezeigt werden, dies ist jedoch lsusb
nicht erforderlich. Je weniger externe Befehle Sie aufrufen, desto besser, da jeder Aufruf eines nicht integrierten Befehls Kosten für CPU, Speichernutzung und Ausführungszeit verursacht (obwohl die Befehle wahrscheinlich aus dem Speicher vorgeladen sind).
Siehe auch:
while [ true ]
dies eine Endlosschleife erzeugt, aber möglicherweise nicht aus dem Grund, den Sie glauben, dass dies der Fall ist.while [ false ]
Auch erzeugt eine Endlosschleife, weil mit einem einzigen Argumente,[ ... ]
gelingt es , wenn das Argument eine nicht leere Zeichenfolge ist.while true
wird tatsächlich einen Befehl namens ausführentrue
(der immer erfolgreich ist).