Atribuir variável usando várias linhas

4

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 pfnuesel 31.10.2018 / 04:26

4 respostas

3

Você pode usar um subshell para comer o recuo:

if foo; then
    x=$(
    )$(f)
fi

Alternativamente:

if foo; then
    set -- "$(f)"
    x=$1
fi
    
por 31.10.2018 / 05:59
11

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
    
por 31.10.2018 / 09:49
2

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 31.10.2018 / 05:19
2

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)
    
por 31.10.2018 / 06:22