Frage Bash-Shell-Skript, das die Ausgabe von Befehlen hinzufügt


Sagen wir, ich habe einen Befehl angerufen foo welches beim Aufruf eine Zahl auf den Bildschirm gibt:

$ foo
3

Lassen Sie uns auch sagen, dass ich einen anderen Befehl aufgerufen habe bar welches beim Aufruf eine andere Nummer auf den Bildschirm gibt:

$ bar
5

Ich suche ein Shell-Skript, das die Ausgabe von arithmetisch addiert foo und bar (3 + 5 = 8). Wie würde ich das tun? (Die Ausgaben der Befehle sind nicht vor der Zeit bekannt. Sie waren zufällig beim letzten Mal 3 und 5 gewesen. Sie hätten etwas anderes sein können.)


4
2018-04-22 17:22


Ursprung


Was meinst du mit addieren? Sind die Programmausgaben immer ganze Zahlen und Sie wollen 3 + 5 = 8 oder sind sie Strings und Sie wollen '3' + '5' = '35'. - Benjamin Bannier
Sie sind ganze Zahlen, und ich möchte sie hinzufügen (3 + 5 = 8), nicht verketten - John Kube


Antworten:


Verwenden Sie Bashs let um arithmetische Ausdrücke auszuwerten.

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

let c=$a+$b
echo $c

Ersetzen Sie einfach die Anrufe zu echo mit Ihren Programmanrufen.


8
2018-04-22 17:39



Sie können die Dollarzeichen in a weglassen let Erklärung. - Dennis Williamson
@Dennis: Ich weiß, aber so geht es zumindest scheinen konsistent. Der kürzeste Weg (traurig?) Ist oft der wahrscheinlichste zu verwechseln (vgl. Perl;) - Benjamin Bannier
let ist der Teufel. Es fühlt sich an wie BASIC und bringt Baby Pandas zum Weinen. Der Doppel-Paren-Mechanismus schadet den Pandas nicht. ;) - dannysauer


Eine Alternative zu let ist die Verwendung der Doppelklammer-Syntax:

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

oder

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

oder mit Variablen können Sie das Dollarzeichen auf der rechten Seite des Gleichen weglassen:

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

(was auch eine inkrementelle Zuweisung darstellt)

Wenn Sie Nicht-Ganzzahlen verwenden, die Sie verwenden können bc:

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

oder

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

Ein Vorteil doppelter Klammern ist, dass Sie Leerzeichen um die Operanden und Operatoren setzen können, um die Dinge lesbarer zu machen:

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

3
2018-04-22 18:19





bash:

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

Wenn die Ausgabe nur ganze Zahlen ist:

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

1
2018-04-22 17:39