Para complementar as grandes respostas existentes:
Se você usa bash
e prefere usar novas linhas reais para facilitar a leitura , read
é outra opção para capturar um aqui-doc em uma variável , que (como outras soluções aqui) não requer o uso de um subshell.
# Reads a here-doc, trimming leading and trailing whitespace.
# Use 'IFS= read ...' to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF' # Use 'IFS= read ...' to preserve the trailing \n
Hello World
===========
EOF
# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
-
-r
garante que read
não interprete a entrada (por padrão, isso traria barras invertidas como especiais, mas isso raramente é necessário).
-
-d ''
define o delimitador "record" como uma string vazia, fazendo com que read
leia a entrada inteira de uma só vez (em vez de apenas uma única linha).
Observe que, deixando o $IFS
(o separador de campo interno) como padrão, $' \t\n'
(um espaço, uma guia, uma nova linha), qualquer espaço em branco à esquerda e à direita é cortado do valor atribuído a $str
, que inclui a nova linha final do here-doc.
(Note que mesmo que o corpo do here-doc inicie na linha após o delimitador start ( 'EOF'
here), ele não contém um leading newline).
Geralmente, esse é o comportamento desejado, mas se você quiser essa nova linha, use IFS= read -r -d ''
em vez de apenas read -r -d ''
, mas observe que qualquer espaço em branco à esquerda e em branco é preservado.
(Observe que prefixar IFS=
diretamente ao comando read
significa que a atribuição está em vigor apenas durante esse comando, portanto, não há necessidade de restaurar o valor anterior.)
Usar um aqui-doc também permite que você utilize opcionalmente o recuo para definir a sequência multilinha para legibilidade:
# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
Hello World
===========
EOF
# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]
Colocar -
entre <<
e o delimitador de abertura here-doc ( 'EOF'
, here) faz com que os caracteres de tabulação principais sejam removidos do corpo here-doc e até mesmo do delimitador de fechamento,
mas note que este só funciona com real caracteres da aba , não em espaços, por isso, se o seu editor traduz pressionamentos de teclas de abas em espaços, é necessário trabalho extra.