No terminal do Ubuntu 18.04 LTS, quando escrevo este comando:
echo -e "Hello\\\n"
Dá isto como a saída:
Hello\n
Mas deve ser impresso, como diz a página do manual :
Hello\
Ou seja, primeiro imprima Hello
, depois \
um caractere de nova linha (e depois outra nova linha). Onde está o problema?
Veja estes poucos echo -e
comandos e sua saída :
man420@man420-X542UQ:~$ echo -e "HEllo\a\a\a\a\a\a\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\a\\\n"
HEllo\n
command-line
echo
yolin00
fonte
fonte
echo
em primeiro lugar: useprintf
.Respostas:
As barras invertidas são tratadas especialmente por
echo -e
, mas primeiro são às vezes tratadas especialmente pelo shell (que neste caso ébash
), de acordo com as regras de cotação do shell .O argumento
echo
realmente vê éHello\\n
. Como você passou-e
paraecho
, ele trata escapes de barra invertida especialmente e\\
é recolhido para um único\
. A finaln
não é escapada, então aparece literalmente.A razão para isso é que, antes e separadamente da operação em
echo
si, o shell trata\
especialmente em alguns contextos, mas não em outros. Não cotadas\
personagens são sempre tratados de maneira especial, único citado\
nunca são tratados de maneira especial, mas o tratamento da dupla citou\
personagens, como no comando que você executou, é mais sutil e complicado.Quando o shell encontra um texto com aspas duplas em um comando,
"Hello\\\n"
ele trata\
como um caractere de escape quando precede um caractere que pode ter um significado especial entre aspas duplas e não o contrário .\
às vezes tem um significado especial por dentro""
, um\
que precede imediatamente outro\
tem o efeito de citar esse segundo\
. Assim, entre aspas duplas, as primeiras\\
são recolhidas\
.\
caracteres, existe um terceiro\
caractere que não é afetado pelos dois primeiros e que precede umn
. Masn
não é um personagem que é tratado especialmente entre aspas duplas, portanto, o\
antes não é tratado especialmente nessa situação. Assim\n
fica\n
.O efeito é que, entre aspas duplas,
\\\n
é interpretado como\\n
.Quando
echo -e
vê\\n
, o primeiro\
remove um significado especial do segundo, entãoecho
imprime\n
literalmente para esse texto.Se seu objetivo é imprimir
Hello
com uma nova linha extra, mas sem barras invertidas (a pergunta era originalmente ambígua sobre isso, mais acho que é um exemplo útil), então uma solução é remover a\
. Execução deecho -e "Hello\\n"
saídasHello
com uma nova linha extra no final.Uma solução melhor é usar aspas simples e escrever
echo -e 'Hello\n'
. Aspas simples são a forma mais forte de citar. Uma solução ainda melhor é geralmente usar emprintf
vez deecho
, o que nesse caso seriaprintf 'Hello\n\n'
.Se seu objetivo é imprimir,
Hello\
incluindo a barra invertida, seguida por uma nova linha extra , a abordagem de aspas duplas é possível, mas complicada. Para descobrir, trabalhe de trás para frente:echo -e
converte\\
para\
e\n
para uma nova linha e aspas duplas\\
para\
, para que você possa fazer isso com seis barras invertidas (echo -e "Hello\\\\\\n"
), porque\\n
se transforma\n
devido a uma barra invertida escapando da outra. Você também pode fazer isso com cinco, porque as aspas duplas ficam retidas\n
quando\
não é escapado.Isso ilustra o benefício da citação simples: basta colocar o que você deseja
echo -e
ver dentro das aspas simples (echo -e 'Hello\\\n'
).printf
também é bom aqui. Uma opção éprintf 'Hello\\\n\n'
. Mas ondeprintf
realmente brilha é que você pode conectar argumentos adicionais. Você pode usarprintf '%s\n\n' 'Hello\'
, que insere o segundo argumento (literalmente,Hello\
porque aspas simples não mudam nada) no lugar de%s
.fonte