Considere o seguinte script:
#!/bin/bash
foo=Hello
bar=Word
cat <<EOF
No quotes single word delimiter expands
$foo
$bar
EOF
cat <<'EOF'
Single-quoted single word delimiter does not expand.
$foo
$bar
EOF
cat <<"EOF"
Double-quoted single word delimiter does not expand.
$foo
$bar
EOF
cat <<EOF\ SOME\ MORE
Unquoted multi-word word delimiter does not expand.
Can we get it to expand?
$foo
$bar
EOF SOME MORE
No último caso, estou usando um delimitador multipalavra, sem aspas, mas a saída é a seguinte:
Unquoted multi-word word delimiter does not expand.
Can we get it to expand?
$foo
$bar
Existe uma maneira de fazer o bash expandir variáveis ao usar um delimitador heredoc de várias palavras?
Quando o delimitador ou qualquer parte dele é citado (por qualquer operador de citação, incluindo
'...'
,"..."
,\
,$'...'
,$"..."
), nenhuma expansão é feita no documento aqui.O delimitador é um token único na sintaxe do shell, então qualquer caractere como espaço, tabulação (e outros caracteres de byte único classificados como espaços em branco no local),
;
,<
,|
só pode ser usado em delimitadores se estiver entre aspas, pois eles delimitam tokens na sintaxe do idioma, o que significa que não haverá expansão no documento here, ou como parte de um "token" de shell que inclui espaços como$(foo bar)
,$[foo bar]
,$(( foo bar ))
,${--foo bar}
, etc. Ou você pode usar outros caracteres de espaço multibyte, como UTF-8 codificado U+00A0 NO-BREAK SPACE ou U+2003 EM SPACECuriosamente, o espaço parece não ser considerado como citado em:
Usando um espaço em branco multibyte:
O
entre
FOO
eBAR
acima é um caractere U+2003, não um espaço ASCII U+0020, codificado em UTF-8 como bytes 0xe2 0x80 0x83.Esteja ciente de que se esse script for executado em um local onde qualquer um desses três bytes for a codificação de um caractere classificado como espaço em branco , isso falhará, pois o bash o tratará como um separador, como espaço ou tabulação (um dos motivos pelos quais geralmente é recomendado colocar entre aspas caracteres não ASCII no bash).
Na prática, porém, o único caractere não ASCII que sei que alguns sistemas (como alguns BSDs) consideram como em branco e que tem uma codificação de byte único é U+00A0, e só consegui encontrar o conjunto de caracteres NeXT onde esse caractere é codificado como 0x80 (pelo menos de acordo com a GNU libc ), mas nunca me deparei com um local usando esse charmap.
(você também pode argumentar que usar espaços em branco não-ASCII em um script é uma maneira certa de confundir leitores e mantenedores do script)
O manual do Bash, na seção Here Documents :
E aspas incluem "o caractere de escape, aspas simples e aspas duplas". Então não parece que isso seja possível. As únicas expansões não mencionadas acima são as expansões de histórico e alias, e usar qualquer uma delas ainda exigiria aspas para uma palavra que inclua espaços ou outros metacaracteres. Conforme observado nos comentários, também há expansão de chaves e expansão de til, mas nenhuma delas ajuda aqui.