Warum ersetzt eine Variablenzuweisung Registerkarten durch Leerzeichen in der Shell?
%Vor% Sie müssen Ihre Variable $res
für den zu haltenden Whitespace angeben.
Von man bash
unter QUOTING
:
Zitieren wird verwendet, um die besondere Bedeutung bestimmter Zeichen zu entfernen oder Worte an die Shell. Quoting kann verwendet werden, um spezielle Behandlung für Sonderzeichen zu deaktivieren, zu verhindern reservierte Wörter werden als solche erkannt und verhindern die Parametererweiterung.
Jeder der oben unter DEFINITIONEN aufgeführten Metazeichen hat eine besondere Bedeutung für die Shell und muss zitiert werden, wenn es sich selbst darstellen soll.
%Vor%
Es ist nicht die Zuweisung, die die Registerkarten verliert, sondern den echo
-Befehl aufruft.
res
ist ein Wert zugewiesen, der Registerkarten enthält. Wenn Sie in der Shell schreiben, schreiben Sie $res
, was dem Inhalt der Variablen res
an diesem Punkt entspricht.
Also:
%Vor%macht dasselbe wie:
%Vor% (Die großen Leerzeichen in dieser Zeile sind Tabulatorzeichen, die durch Drücken von Ctrl+V Tab
eingegeben werden können). Und wenn Sie diesen Befehl ausführen, erhalten Sie auch:
Also ist Ihre Frage eigentlich: Warum verschwinden Registerkarten in den Argumenten eines Befehls?
Die Antwort ist, dass der Befehl ( echo
in diesem Fall) niemals die Tabs oder die Leerzeichen sehen kann. Die Shell analysiert Ihre Befehlszeile in einen Befehlsnamen und eine Liste von Argumenten. Es verwendet Leerzeichen (Tabs und Leerzeichen), um den Befehl in diese Teile aufzuteilen. Dann führt es den Befehl aus und übergibt ihm die Argumentliste.
Also, was echo
als Argumente erhält, ist die Liste 'a', 'b', 'e', 'c', 'd'; es hat keine Ahnung, welche Zeichen sie ursprünglich getrennt haben.
Was echo
dann tut, gibt jedes seiner Argumente mit einem Leerzeichen zwischen ihnen aus. Daher die Ausgabe, die Sie sehen. Wo die ursprüngliche Befehlszeile ein einzelnes Leerzeichen verwendet hat, um jedes Argument zu trennen, stimmt die Ausgabe mit der Eingabe überein. Es sieht also ähnlich aus wie die Leerzeichen in der Eingabe - aber nicht: Die Shell verschlingt die ursprünglichen Leerzeichen und echo
fügt neue hinzu.
Anführungszeichen können verwendet werden, damit die Shell mehrere "Wörter" als einzelnes Argument behandelt. Zum Beispiel wenn du folgendes tust:
%Vor% übergibt 3 Argumente an echo
: 'a', 'b c' und 'd'. Das mittlere Argument enthält 4 Leerzeichen. Diese werden an echo
übergeben und erscheinen in ihrer Ausgabe. Die Leerzeichen außerhalb der Anführungszeichen werden von der Shell zum Teilen von Argumenten verwendet und nicht an echo
übergeben. Daher ist die Ausgabe:
Um diese Art von Dingen zu überprüfen, ist es klarer, einen Befehl zu verwenden, der Ihnen genau zeigt, wie viele Argumente er erhalten hat und was in jedem von ihnen war. Dieser Perl-One-Liner macht das:
%Vor%