Bash как сохранить деление в переменной

Я пытаюсь вычислить формулу ниже и сохранить значение в переменной.

Псевдокод должен выглядеть так:

a=10
b=5
c=$(((($a-$b)/52)) | bc -l)
echo $c

Результат пуст. Я не мог понять синтаксис с помощью bc. Пожалуйста, помогите мне использовать bc вместо awk или другой метод.


person lovechillcool    schedule 15.03.2018    source источник
comment
также отмечает, что если вам нужно выполнить тяжелые вычисления с плавающей запятой и т. д., bash может быть не тем инструментом, который вам следует использовать для этого !!! Каждый раз, когда вы вызываете bc, вы создаете подпроцесс (пользователь системного вызова - ›режим ядра, fork, exec, ... затем требуется время с выделением памяти, новой записью в таблице процессов, дополнительной работой для планировщика процессов, промахами в кэше и в конечном итоге страница пропускается, динамическая библиотека может быть загружена _2 _, ...), поэтому вы теряете много циклов ЦП. Этого не было бы, если бы вы использовали для этого соответствующий язык!   -  person Allan    schedule 15.03.2018
comment
См .: Разделение в скрипте и с плавающей запятой   -  person Cyrus    schedule 15.03.2018


Ответы (2)


Есть две вещи, о которых вам нужно знать. Во-первых, bc использует стандартный ввод для выражений, поэтому вам нужно будет фактически перенаправить свое выражение через него или использовать оператор перенаправления <<<, один из:

c=$(echo "($a - $b) / 52" | bc)
c=$(bc <<< "($a - $b) / 52")

Метод <<< специфичен для bash и ksh (возможно других, но я не совсем уверен в них). Другой метод можно использовать в большинстве оболочек.

Во-вторых, вы должны быть осторожны при использовании для этого больших чисел, поскольку bc имеет раздражающую привычку разбивать их по строкам:

pax$ x=999999999999999999999999999999999999999999999999999999999999999999999

pax$ echo "$x / 7" | bc
14285714285714285714285714285714285714285714285714285714285714285714\
2

Чтобы этого избежать, нужно изменить длину строки:

pax$ echo "$x / 7" | BC_LINE_LENGTH=0 bc
142857142857142857142857142857142857142857142857142857142857142857142
person paxdiablo    schedule 15.03.2018

Вы можете использовать это:

a=10
b=5
c=$(bc -l <<< "($a-$b)/52")
echo "$c"

.09615384615384615384

Or by setting a scale of 3:

c=$(bc -l <<< "scale=3; ($a-$b)/52")
echo "$c"

.096
person anubhava    schedule 15.03.2018
comment
Я выбрал paxdiablo, поскольку его ответ более исчерпывающий. Спасибо за внимание! - person lovechillcool; 15.03.2018