A solução é usar $'string'
, por exemplo:
$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World
Aqui está um trecho da página de manual do Bash:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not
been present.
A double-quoted string preceded by a dollar sign ($"string") will cause
the string to be translated according to the current locale. If the
current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
STR=$"Hello\nWorld"
simplesmente imprimeHello\nWorld
.H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
, repetirá "Hello" e "World" em linhas separadasO eco é tão noventa e tão cheio de perigos que seu uso deve resultar em lixões não inferiores a 4 GB. Sério, os problemas da echo foram a razão pela qual o processo de padronização do Unix finalmente inventou o
printf
utilitário, eliminando todos os problemas.Então, para obter uma nova linha em uma string:
Lá! Sem SYSV vs BSD eco loucura, tudo é impresso com clareza e suporte totalmente portátil para seqüências de escape C. Todo mundo, por favor, use
printf
agora e nunca olhe para trás.fonte
$'string'
é ainda mais limpa.$'foo'
sintaxe não é válida para POSIX a partir de 2013. Muitos shells reclamam.BAR=$(printf "hello\nworld\n")
não imprime a fuga \ n para mim$()
é especificado pelo POSIX como removendo sequências de um ou mais caracteres <newline> no final da substituição .O que fiz com base nas outras respostas foi
fonte
O problema não está no shell. Na verdade, o problema está no
echo
próprio comando e na falta de aspas duplas em torno da interpolação da variável. Você pode tentar usar,echo -e
mas isso não é suportado em todas as plataformas, e um dos motivosprintf
agora é recomendado para portabilidade.Você também pode tentar inserir a nova linha diretamente no seu script de shell (se um script é o que você está escrevendo), para que pareça ...
ou equivalente
fonte
Acho a
-e
bandeira elegante e diretaSe a string é a saída de outro comando, eu apenas uso aspas
fonte
echo
.echo -e
é notório por seus problemas de portabilidade. Esta é menos uma situação do Velho Oeste agora do que antes do POSIX, mas ainda não há razão para preferirecho -e
. Veja também stackoverflow.com/questions/11530203/…A única alternativa simples é realmente digitar uma nova linha na variável:
Sim, isso significa escrever Enteronde necessário no código.
Existem vários equivalentes a um
new line
personagem.Mas tudo isso exige "uma interpretação" de alguma ferramenta ( POSIX printf ):
E, portanto, a ferramenta é necessária para criar uma string com uma nova linha:
Em alguns shells, a sequência $'é uma expansão especial do shell. Conhecido por funcionar em ksh93, bash e zsh:
Obviamente, soluções mais complexas também são possíveis:
Ou
fonte
Um $ antes das aspas simples '... \ n ...' da seguinte maneira, no entanto, aspas duplas não funcionam.
fonte
Não sou especialista no bash, mas este funcionou para mim:
Achei isso mais fácil de formatar os textos.
fonte
$NEWSTR
deecho "$NEWSTR"
são importantes aquiNo meu sistema (Ubuntu 17.10), seu exemplo funciona como desejado, quando digitado na linha de comando (para
sh
) e quando executado como umsh
script:Acho que isso responde à sua pergunta: simplesmente funciona. (Não tentei descobrir detalhes como em que momento exatamente
\n
ocorre a substituição do caractere de nova linhash
).No entanto, notei que esse mesmo script se comportaria de maneira diferente quando executado com
bash
e seria impressoHello\nWorld
:Consegui obter a saída desejada com
bash
o seguinte:Observe as aspas duplas ao redor
$STR
. Isso se comporta de forma idêntica se salvo e executado como umbash
script.O seguinte também fornece a saída desejada:
fonte
Aqueles exigentes que precisam apenas da nova linha e desprezam o código multilinha que quebra o recuo, poderiam fazer:
O Bash (e provavelmente outros shells) devoram todas as novas linhas à direita após a substituição do comando; portanto, você precisa finalizar a
printf
string com um caractere que não seja da nova linha e excluí-la posteriormente. Isso também pode facilmente se tornar um oneliner.fonte
Eu não estava realmente feliz com nenhuma das opções aqui. Isto é o que funcionou para mim.
fonte
str=$(printf '%s\n' "first line" "another line" "and another line")
(o shell irá convenientemente (ou não) aparar qualquer nova linha final da substituição de comando). Várias respostas aqui já são promovidasprintf
de várias formas, por isso não tenho certeza se isso agrega valor como resposta separada.printf '%s\n' "first line" \
(nova linha, recuo)'second line'
etc. Consulte tambémprintf -v str
para atribuir a uma variável sem gerar um subshell.