Como faço para ecoar uma string com múltiplos espaços no bash “intocado”? [duplicado]

11

Eu atribuí um var como este:

MYCUSTOMTAB='     '

Mas usá-lo em eco:

echo $MYCUSTOMTAB"blah blah"

ou

echo -e $MYCUSTOMTAB"blah blah"

apenas retorna um espaço único e o restante da string:

 blah blah

Como posso imprimir a seqüência completa intocada? Eu quero usá-lo para ter um recuo personalizado porque \t é muito grande para o meu gosto.

    
por user3450548 01.04.2016 / 16:40

4 respostas

18

Coloque sua variável dentro de aspas duplas para evitar divisão de campo , que comeu seus espaços:

$ MYCUSTOMTAB='     '
$ echo "${MYCUSTOMTAB}blah blah"
     blah blah
    
por 01.04.2016 / 16:46
8

Como sugerido em esta resposta , citar a variável é suficiente.

A razão pela qual o citar é necessário no seu caso é porque sem ele o bash aplica o operador split + glob na expansão de $MYCUSTOMTAB . O valor padrão de $IFS contém o caractere TAB, portanto, em echo -e $MYCUSTOMTAB"blah blah" , $MYCUSTOMTAB é simplesmente dividido em nada, então ele se torna o mesmo que se você tivesse escrito:

echo -e "blah blah"

(você provavelmente não quer -e aqui btw).

Você também pode usar printf em vez de echo :

printf '%s\n' "$MYCUSTOMTAB"

printf '%s\n' "${MYCUSTOMTAB}blah blah"

Ou se você quiser que printf faça o mesmo tipo de \n , \t expansões que echo -e usam, use %b em vez de %s :

printf '%b\n' "${MYCUSTOMTAB}blah blah"

Para referência, leia Por que o printf é melhor que o eco?

    
por 01.04.2016 / 16:45
2

Acho que você só precisa usar aspas duplas para sua variável

echo -e "$MYCUSTOMTAB"."blah blah"
    
por 01.04.2016 / 16:47
1

Sei que sua pergunta está marcada como bash , mas, de qualquer forma, para máxima portabilidade e confiabilidade, eu usaria:

printf "%sblah blah\n" "$MYCUSTOMTAB" 

ou

someString="blah blah"
printf "%s%s\n" "$MYCUSTOMTAB" "$someString"
    
por 01.04.2016 / 16:50