Warum lässt mein Skript führende Leerzeichen in der Konsolenausgabe weg?

10

Ich habe das folgende Skript:

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

Wenn ich es ausführe, erhalte ich die folgende Ausgabe:

$ ./test.sh
indented by 4 spaces

Wo sind meine 4 Felder geblieben? Und wie bekomme ich sie zurück?

Der Hochstapler
quelle

Antworten:

22

Zitieren echoSie einfach das in Ihrer Funktion:

function consoleWriteLine() {
  echo "$*" >&2
}

echobemerkt nur mehrere durch Leerzeichen getrennte Argumente und druckt sie getrennt durch ein einzelnes Leerzeichen. Sehen:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

Im letzten Beispiel die Zeichenfolge a b cist ein einziges Argument und echoed wie es ist.

Chaos
quelle
Der Schlüssel, den ich hier verstehen musste, war, dass das Zitieren des Arguments zunächst nur das Leerzeichen beibehält, bis es übergeben wird consoleWriteLine. Beim zweiten Mal muss echodas Leerzeichen durch zusätzliche Anführungszeichen wieder erhalten werden. Ich hätte nie gedacht, dass Sie Zitate setzen können $*.
Der Hochstapler
4
Sie können nicht nur Anführungszeichen setzen $*, die Variante $@wurde speziell entwickelt, um beim Zitieren in separate Wörter zu expandieren : "$@"Kann mehrere Argumente enthalten, "$*"ist immer nur eines. echoist einer der wenigen Befehle, bei denen es keinen Unterschied macht.
Alexis
4

Hatte dieses Problem selbst,

Gemäß diesem Blog müssen Sie die IFS ändern , wie es standardmäßig Leerraum enthält , und sehen so „xxx yyy zzzz“ als 3 Strings mit weißen Raum zwischen ihnen.

IFS='\n'

vor dem Befehl wird es behoben und IFS deaktiviert, um die Änderung zu entfernen

unset IFS

djsmiley2kStaysInside
quelle
2
Dies funktioniert, aber die akzeptierte Lösung (Hinzufügen von Anführungszeichen) ist viel ordentlicher.
Caesarsol
Nicken, ich habe nicht bemerkt, dass es nicht zitiert wurde. Hoppla! : D
djsmiley2kStaysInside