Pourquoi mon script omet-il les espaces blancs de tête dans la sortie de la console?

10

J'ai le script suivant:

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

consoleWriteLine "    indented by 4 spaces"

Lorsque je l'exécute, j'obtiens la sortie suivante:

$ ./test.sh
indented by 4 spaces

Où sont passés mes 4 espaces? Et comment les récupérer?

Der Hochstapler
la source

Réponses:

22

Citez simplement le echodans votre fonction:

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

echoremarque simplement plusieurs arguments séparés par un espace et les imprime séparés par un seul espace. Voir:

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

Dans le dernier exemple, la chaîne a b cest un seul argument et echoéditée telle quelle.

le chaos
la source
La clé pour moi de comprendre ici était, citant l'argument initialement ne conservera que l'espace blanc jusqu'à ce qu'il soit passé en consoleWriteLine. La deuxième fois, c'est echole blanc qui doit être à nouveau préservé par des guillemets supplémentaires. Je n'aurais jamais pensé que vous pouviez mettre des guillemets $*.
Der Hochstapler
4
Non seulement vous pouvez mettre des guillemets $*, la variante a $@été spécialement créée pour être développée en mots séparés lorsqu'elle est citée: "$@"peut être plusieurs arguments, n'en "$*"est qu'un. echoest l'une des rares commandes où cela ne fait aucune différence.
alexis
4

J'ai eu ce problème moi-même,

Selon ce blog, vous devez modifier l'IFS car, par défaut, il contient un espace blanc et voit donc "xxx yyy zzzz" comme 3 chaînes avec un espace blanc entre elles.

IFS='\n'

avant la commande le corrige et désactive IFS pour supprimer la modification

unset IFS

djsmiley2kStaysInside
la source
2
cela fonctionne, mais la solution acceptée (en ajoutant des guillemets) est beaucoup plus nette.
caesarsol
Non, je n'ai pas remarqué que ce n'était pas cité. Oups! : D
djsmiley2kStaysInside