¿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?

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á.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.