Как передать результаты bc в переменную

15

Я пишу сценарий и хочу передать результаты bcв переменную. Я объявил 2 переменные ( var1и var2) и дал им значения. В моем сценарии я хочу передать результаты из bcдругой переменной скажем, var3чтобы я мог работать с var3другими вычислениями. До сих пор я был в состоянии записать результат в файл, который не то, что я ищу, а также я смог отобразить результат в терминале, но я просто хочу передать результат в переменную в данный момент, чтобы Я могу работать с этой переменной.

echo "scale=2;$var1/var2" | bc
Шаолинь
источник

Ответы:

23

Если вы используете bash, вам лучше использовать строку here вместо канала, как в:

bc <<< "scale=2;$var1/$var2"

Это сэкономит вам недоработку.

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

answer=$(bc <<< "scale=2;$var1/$var2")

Редактировать.

Если вы хотите что-то еще круче bc, вот dc (калькулятор обратной польской):

answer=$(dc <<< "2k $var1 $var2/p")
gniourf_gniourf
источник
1
Да, я использую Bash, не могли бы вы уточнить на подоболочке? Есть ли недостаток?
Шаолинь
2
Каждый раз, когда вы используете канал, |команда справа от канала выполняется в подоболочке, и для открытия новой подоболочки требуются ресурсы (это похоже на открытие нового экземпляра bash для выполнения этой команды). Если вы можете избежать этого, избегайте этого. В данном случае передача команды echoto bcзапускает команду bcв подоболочке и в некотором смысле замедляется (без обид), поскольку bash имеет замечательную конструкцию here-string, <<<позволяющую избежать таких глупых вещей, как эти.
gniourf_gniourf
@gniourf_gniourf Опять же, если вы заботитесь об использовании ресурсов, вы бы использовали /bin/sh(dash) вместо bash, но dash не имеет <<<.
Жиль "ТАК - перестань быть злым"
Спасибо за полезную информацию! Это хорошая информация для сохранения ресурсов и подоболочек. Я очень ценю ваш вклад.
Шаолинь
1
@Gilles просто сравните time for i in {1..10000}; do : <<< ""; doneс time for i in {1..10000}; do echo "" | : ; done, вы увидите резкое различие. Тогда вы правы, heredoc немного быстрее, чем Herestring. Но это более неудобно печатать как однострочник.
gniourf_gniourf
9

Подстановка команд сохраняет выходные данные команды в переменную.

var3=$(echo "scale=2;$var1/$var2" | bc)
Жиль "ТАК - перестань быть злым"
источник
Спасибо! Это дало мне именно то, чего я хотел, после часа исследований. Спасибо
шаолинь