Por que meu script omite espaços em branco à esquerda na saída do console?

10

Eu tenho o seguinte script:

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

consoleWriteLine "    indented by 4 spaces"

Quando o executo, recebo a seguinte saída:

$ ./test.sh
indented by 4 spaces

Para onde foram meus 4 espaços? E como os recupero?

Der Hochstapler
fonte

Respostas:

22

Apenas cite echona sua função:

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

echoapenas percebe vários argumentos separados por espaço e os imprime separados por um único espaço. Vejo:

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

No último exemplo, a cadeia de caracteres a b cé um argumento único e echoed como é.

caos
fonte
A chave para eu entender aqui foi: citar o argumento inicialmente preservará apenas o espaço em branco até que ele seja passado consoleWriteLine. Na segunda vez echo, o espaço em branco precisa ser preservado novamente por aspas adicionais. Eu nunca imaginaria que você pode colocar aspas $*.
Der Hochstapler
4
Não apenas você pode colocar aspas $*, a variante $@foi criada especificamente para expandir em palavras separadas quando citada: "$@"pode haver vários argumentos, "$*"é sempre apenas um. echoé um dos poucos comandos em que não faz diferença.
Alexis 9/15
4

Eu mesmo tive esse problema,

Conforme este blog, você precisa alterar o IFS, pois, por padrão, ele contém espaços em branco e, por isso, vê "xxx yyy zzzz" como três strings com espaço em branco entre eles.

IFS='\n'

antes do comando irá corrigi-lo e desabilitar o IFS para remover a alteração

unset IFS

djsmiley2kStaysInside
fonte
2
isso está funcionando, mas a solução aceita (adicionar aspas) é muito mais clara.
Caesarsol # 8/15
Não, eu não percebi que não foi citado. Ops! : D
djsmiley2kStaysInside