eu tenho uma função
f(){
echo 777
}
e uma variável à qual atribuo o "valor de retorno" da função.
x=$(f)
Muito conciso! No entanto, no meu código real, os nomes de variáveis e funções são um pouco mais longos e a função também consome argumentos posicionais, de modo que a linha concisa acima fica muito longa. Como gosto de manter as coisas organizadas, gostaria de dividir o código acima em duas linhas.
x=\
$(f)
Ainda funciona! Mas: manter as coisas arrumadas também significa respeitar o recuo, então isso dá algo como
if foo
x=\
$(f)
fi
que não funciona mais devido a espaços em branco! Existe uma boa solução para isso?
Por que optar por construções complexas e difíceis de ler? Existe uma maneira perfeitamente natural de apresentar isso que não precisa de nenhuma atribuição intermediária, maneiras sofisticadas de construir uma string vazia, citar sutilezas ou outra carga cognitiva.
Você pode armazenar o valor em
$_
, que é definido como o último argumento:Ou pode usar um subshell para comer o recuo:
Se você tem permissão para usar here-docs, o estilo a seguir funciona bem. Citar a string here-doc com uma entrelinha
-
permite que seu código seja destinado apenas a tabulações .Algo como
Mas lembre-se de copiar e colar o código acima não funciona, pois o Stack Exchange substitui as guias por espaços. Você precisa digitar cuidadosamente o Tabcaractere para as linhas que começam com o here-doc e as linhas que terminam com o here-doc. Minha
vim
configuração mapeou o caractere de tabulação para 8 espaços. Se você quiser torná-lo ainda mais limpo, modifique a regra de espaçamentovim
definindo o espaçamento para tab como 4 espaços como:set tabstop=4
Você pode ver como o Tabestá formatado no meu script, examinando-o usando
sed
Observe os
\t
caracteres na string here-doc acima. Se o seu script for diferente do acima, você verá osEOF
erros inesperados.Por que dividir a linha no sinal de igual? Você pode simplesmente definir os argumentos para a função em uma variável separada: