Вопрос скрипт bash, который добавляет выходные данные команд


Допустим, у меня есть команда под названием foo который печатает номер на экране при вызове:

$ foo
3

Давайте также скажем, что у меня есть другая команда, называемая bar который печатает другой номер на экране при вызове:

$ bar
5

Я хочу написать сценарий оболочки, который будет арифметически добавлять вместе вывод foo а также bar (3 + 5 = 8). Как мне это сделать? (Выходы из команд неизвестны заранее. Они просто так были 3 и 5 в последний раз, когда они были запущены. Они могли быть чем-то другим).


4
2018-04-22 17:22


происхождения


Что вы подразумеваете, добавляя вместе? Являются ли программные выходы всегда целыми числами, и вы хотите 3 + 5 = 8 или они являются строками, и вы хотите «3» + «5» = «35». - Benjamin Bannier
они целые, и я хочу добавить их (3 + 5 = 8), а не конкатенировать их - John Kube


ответы:


Используйте bash's let для вычисления арифметических выражений.

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

let c=$a+$b
echo $c

Просто замените вызовы echo с вашими программными вызовами.


8
2018-04-22 17:39



Вы можете опустить знаки доллара в let заявление. - Dennis Williamson
@Dennis: Я знаю, но так оно и есть казаться последовательны. Самый короткий путь (к сожалению?) Часто сбивает с толку (см. Perl;) - Benjamin Bannier
let это дьявол. Он чувствует себя как Бейсик, и заставляет ребенка панд плакать. Механизм с двумя парами не вредит пандам. ;) - dannysauer


Альтернатива let заключается в использовании синтаксиса с двойными скобками:

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

или

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

или используя переменные, вы можете опустить знак доллара в правой части равенства:

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

(который также иллюстрирует инкрементное присваивание)

Если вы используете нецелые числа, вы можете использовать bc:

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

или

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

Одним из преимуществ использования двойных скобок является то, что вы можете помещать пробелы вокруг операндов и операторов, чтобы сделать их более читаемыми:

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

3
2018-04-22 18:19





Баш:

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

Если выход является целым числом:

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

1
2018-04-22 17:39