Question script shell bash qui ajoute la sortie des commandes


Disons que j'ai une commande appelée foo qui imprime un numéro à l'écran lorsqu'il est appelé:

$ foo
3

Disons aussi que j'ai une autre commande appelée bar qui imprime un autre numéro à l'écran lorsqu'il est appelé:

$ bar
5

Je cherche à écrire un script shell qui additionnera arithmétiquement la sortie de foo et bar (3 + 5 = 8). Comment pourrais-je faire ça? (Les résultats des commandes ne sont pas connus à l’avance. Ils se sont avérés être 3 et 5 la dernière fois qu’ils ont été exécutés. Ils auraient pu être autre chose.)


4
2018-04-22 17:22


origine


Que voulez-vous dire en additionnant? Les sorties du programme sont-elles toujours des entiers et vous voulez 3 + 5 = 8 ou sont-elles des chaînes et vous voulez "3" + "5" = "35". - Benjamin Bannier
ils sont entiers, et je cherche à les ajouter (3 + 5 = 8), pas les concaténer - John Kube


Réponses:


Utilisez les bash let pour évaluer les expressions arithmétiques.

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

let c=$a+$b
echo $c

Il suffit de remplacer les appels à echo avec vos appels de programme.


8
2018-04-22 17:39



Vous pouvez omettre les signes dollar dans un let déclaration. - Dennis Williamson
@ Dennis: Je sais, mais comme ça au moins sembler cohérent. Le plus court chemin (malheureusement?) Est souvent le plus susceptible de confondre (cf. Perl;) - Benjamin Bannier
let est le diable Cela ressemble à BASIC et fait pleurer les bébés pandas. Le mécanisme à double paren ne nuit pas aux pandas. ;) - dannysauer


Une alternative à let est d'utiliser la syntaxe à double parenthèse:

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

ou

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

ou en utilisant des variables, vous pouvez omettre le signe dollar sur le côté droit de l’égalité:

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

(qui illustre également une affectation incrémentielle)

Si vous utilisez des non-entiers, vous pouvez utiliser bc:

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

ou

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

L'un des avantages de l'utilisation de doubles parenthèses est que vous pouvez placer des espaces autour des opérandes et des opérateurs pour rendre les choses plus lisibles:

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

3
2018-04-22 18:19





frapper:

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

Si la sortie est uniquement des entiers:

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

1
2018-04-22 17:39