¿Por qué mi script omite los espacios en blanco iniciales en la salida de la consola?

10

Tengo el siguiente script:

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

consoleWriteLine "    indented by 4 spaces"

Cuando lo ejecuto, obtengo el siguiente resultado:

$ ./test.sh
indented by 4 spaces

¿A dónde fueron mis 4 espacios? ¿Y cómo los recupero?

Der Hochstapler
fuente

Respuestas:

22

Simplemente cite el echoen su función:

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

echosolo nota múltiples argumentos separados por espacio e imprime los separados por un solo espacio. Ver:

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

En el último ejemplo, la cadena a b ces un solo argumento y se echoedita tal como está.

caos
fuente
La clave para que entendiera aquí fue que citar el argumento inicialmente solo preservará el espacio en blanco hasta que se pase consoleWriteLine. La segunda vez que es echo'd, el espacio en blanco necesita ser preservado nuevamente por comillas adicionales. Nunca hubiera adivinado que puedes poner citas $*.
Der Hochstapler
44
No solo puede poner comillas $*, la variante $@se creó específicamente para expandirse en palabras separadas cuando se cita: "$@"puede haber varios argumentos, "$*"siempre es solo uno. echoes uno de los pocos comandos donde no hay diferencia.
alexis
4

Tuve este problema yo mismo,

Según este blog , debe cambiar el IFS, ya que de forma predeterminada contiene espacios en blanco y, por lo tanto, ve "xxx aaa zzzz" como 3 cadenas con espacios en blanco entre ellas.

IFS='\n'

antes de que el comando lo arregle y desactive IFS para eliminar el cambio

unset IFS

djsmiley2kStaysInside
fuente
2
esto está funcionando, pero la solución aceptada (agregar comillas) es mucho más ordenada.
caesarsol
Nod, no me di cuenta de que no fue citado. Whoops! : D
djsmiley2kStaysInside