Questão script de shell bash que adiciona saída de comandos


Digamos que eu tenha um comando chamado foo que imprime um número na tela quando chamado:

$ foo
3

Vamos dizer também que tenho outro comando chamado bar que imprime outro número na tela quando chamado:

$ bar
5

Eu estou olhando para escrever um script de shell que irá aritmeticamente adicionar juntos a saída de foo e bar (3 + 5 = 8). Como eu faria isso? (As saídas dos comandos não são conhecidas antes do tempo. Elas são as 3 e 5 da última vez que foram executadas. Elas poderiam ter sido outra coisa.)


4


origem


O que você quer dizer com somando? São as saídas do programa sempre inteiros e você quer 3 + 5 = 8 ou são seqüências de caracteres e você quer '3' + '5' = '35'. - Benjamin Bannier
eles são inteiros, e eu estou olhando para adicioná-los (3 + 5 = 8), não concatená-los - John Kube


Respostas:


Use o bash let para avaliar expressões aritmétricas.

#!/bin/bash
a=`echo 3`
b=`echo 5`

let c=$a+$b
echo $c

Basta substituir as chamadas para echo com suas chamadas de programa.


8



Você pode omitir os sinais de dólar em um let declaração. - Dennis Williamson
@Dennis: Eu sei, mas assim faz pelo menos parece consistente. O caminho mais curto (infelizmente?) É freqüentemente o mais provável de confundir (cf. Perl;) - Benjamin Bannier
let é o diabo. Parece BASIC e faz o bebê panda chorar. O mecanismo de duplo parêntese não prejudica os pandas. ;) - dannysauer


Uma alternativa para let é usar a sintaxe de parênteses duplos:

(( c = $(foo) + $(bar) ))

ou

echo $(( $(foo) + $(bar) ))

ou usando variáveis, você pode omitir o cifrão no lado direito dos iguais:

(( c += $(foo) + num ))

(que também ilustra uma atribuição incremental)

Se você estiver usando não inteiros, pode usar bc:

echo "$(foo) + $(bar)" | bc

ou

c=$(echo "$(foo) + $(bar)" | bc)

Uma vantagem de usar parênteses duplos é que você pode colocar espaços ao redor dos operandos e operadores para tornar as coisas mais legíveis:

(( c = ( a + b ) * ( i - j ) ))

3





bash:

bc < <({ foo ; echo + ; bar ; } | tr '\n' ' ' ; echo)

Se a saída for somente inteiros:

$(( $(foo) + $(bar) ))

1