Você pode usar um subshell para comer o recuo:
if foo; then
x=$(
)$(f)
fi
Alternativamente:
if foo; then
set -- "$(f)"
x=$1
fi
Eu tenho uma função
f(){
echo 777
}
e uma variável para a qual eu 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 come argumentos posicionais, de modo que a linha concisa acima fica muito longa. Como gosto de manter as coisas organizadas, gostaria de quebrar 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 escolher construções complexas e difíceis de ler? Existe uma maneira perfeitamente natural de apresentar isso, que não precisa de quaisquer atribuições intermediárias, formas extravagantes de construir uma corda vazia, citando sutilezas ou outros encargos cognitivos.
if foo; then
x=$(
a_very_long_command_name --option1='argument 1 is long' \
--option2='argument 2 is long as well'
)
fi
Se você tiver permissão para usar o here-docs, o estilo a seguir funciona bem. Citando a string here-doc com um -
inicial permite que seu código seja destinado apenas a abas .
Algo como
if true; then
read -d '' -r x <<-EOF
$(f)
EOF
fi
Mas lembre-se de que copiar copiando o código acima não funciona, pois o Stack Exchange substitui as guias por espaços. Você precisa digitar cuidadosamente o caractere Tab para as linhas que começam com o aqui-doc e as linhas que terminam com o aqui-doc. Minha configuração vim
mapeou o caractere de tabulação para 8 espaços. Se você quiser torná-lo ainda mais puro, modifique a regra de espaçamento em vim
definindo o espaçamento da guia como 4 espaços como :set tabstop=4
Você pode ver como a aba é formatada no meu script, olhando para ela usando sed
$ sed -n l script.sh
#!/usr/bin/env bash$
$
$
f(){$
echo 777$
}$
$
if true; then$
\tread -d '' -r x <<-PERSON$
\t$(f)$
\tPERSON$
fi$
$
echo $x$
Observe os caracteres \t
na string here-doc acima. Se o seu script parece diferente do descrito acima, você verá os erros EOF
inesperados.
Por que dividir a linha no sinal de igual? Você pode apenas definir os argumentos para a função em uma variável separada:
unset args
args+='arg1 '
args+='arg2 '
args+='arg3 '
x=$(f $args)
Tags bash newlines assignment