Warum eine Variablenzuweisung Tabulatoren durch Leerzeichen ersetzt

9

Warum ersetzt eine Variablenzuweisung Registerkarten durch Leerzeichen in der Shell?

%Vor%     
MoreFreeze 09.01.2013, 08:42
quelle

2 Antworten

12

Sie müssen Ihre Variable $res für den zu haltenden Whitespace angeben.

%Vor%

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%
    
Chris Seymour 09.01.2013, 08:49
quelle
5

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:

%Vor%

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:

%Vor%

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%     
Smylers 09.01.2013 09:50
quelle

Tags und Links