Quero atribuir à minha variável a
a primeira palavra do resultado do comando func <some_arg>
apenas se não falhar. E se falhar, preciso registrar isso.
O que fiz até agora é:
func() {
if [[ $1 -eq 1 ]]
then
echo 'hello world'
return 0
fi
echo 'Something wrong has happened!' >> path/to/dev.log
return 2
}
a=$(func 1)
r=$?
if [[ $r -eq 0 ]]
then
a=$(awk '{ print $1 }' <<<"$a")
fi
Isso funciona, é claro, mas não gosto de atribuir minha variável a
duas vezes.
Eu tentei isso:
a=$(func 2 | awk '{ print $1 }') || echo 'Something wrong has happened!' >> path/to/dev.log
Mas não registra nada
Existe uma maneira melhor?
Você pode usar
set -o pipefail
para obter o erro da parte anterior do pipeline:Mas, realmente, não consigo ver por que atribuir duas vezes seria um problema. Em essência, você apenas modifica o valor obtido se o comando for bem-sucedido ou o ignora se falhar.
Além disso, você pode condensar um pouco essa lógica:
estampas
O shell tem várias maneiras nativas de analisar a primeira palavra de uma string:
Aparar por sufixo -
${a%% *}
Atribuir a parâmetros posicionais -
set -- ${a}
- o resultado será em$1
. Você pode simplificar isso comset -- $(func 1)
.Divida em elementos da matriz (
bash
somente) -a=( $(func 1) )
- o resultado será em${a[0]}
.Um problema com seu código é que ele falha
a
mesmo que a funçãofunc
retorne um resultado diferente de zero.Em vez de:
A execução disso produzirá
Como você pode ver, no segundo caso,
a
mantém seu valor.