script di shell bash che aggiunge l'output di comandi


4

Diciamo che ho un comando chiamato fooche stampa un numero sullo schermo quando chiamato:

$ foo
3

Diciamo anche che ho un altro comando chiamato barche stampa un altro numero sullo schermo quando chiamato:

$ bar
5

Sto cercando di scrivere uno script di shell che aggiungerà aritmeticamente l'output di fooe bar(3 + 5 = 8). Come potrei farlo? (Gli output dei comandi non sono noti in anticipo. In realtà sono stati 3 e 5 l'ultima volta che sono stati eseguiti. Avrebbero potuto essere qualcos'altro.)


2
Cosa intendi con sommando? Le uscite del programma sono sempre numeri interi e vuoi 3 + 5 = 8 o sono stringhe e vuoi '3' + '5' = '35'.
Benjamin Bannier,

1
sono numeri interi e sto cercando di aggiungerli (3 + 5 = 8), non concatenarli
John Kube

Risposte:


8

Usa bash's letper valutare le espressioni aritmetiche.

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

let c=$a+$b
echo $c

Basta sostituire le chiamate a echocon le chiamate del programma.


È possibile omettere i segni del dollaro in una letdichiarazione.
Dennis Williamson,

@Dennis: lo so, ma in questo modo sembra almeno coerente. Il modo più breve (purtroppo?) È spesso il più probabile da confondere (cfr. Perl;)
Benjamin Bannier,

1
letè il diavolo. Sembra BASIC e fa piangere i piccoli panda. Il meccanismo a doppia coppia non danneggia i panda. ;)
dannysauer,

3

Un'alternativa letè utilizzare la sintassi tra parentesi doppie:

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

o

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

o usando le variabili, puoi omettere il simbolo del dollaro sul lato destro degli uguali:

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

(che illustra anche un'assegnazione incrementale)

Se stai utilizzando numeri non interi puoi utilizzare bc:

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

o

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

Un vantaggio dell'uso delle doppie parentesi è che puoi mettere spazi attorno agli operandi e agli operatori per rendere le cose più leggibili:

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

1

bash:

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

Se l'output è solo numeri interi:

$(( $(foo) + $(bar) ))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.