Jak przekazać wyniki bc do zmiennej

15

Piszę skrypt i chciałbym przekazać wyniki z bcdo zmiennej. Zadeklarowałem 2 zmienne ( var1i var2) i podałem im wartości. W moim skrypcie chcę przekazać wyniki z bcinnej zmiennej powiedz var3, żebym mógł pracować z var3innymi obliczeniami. Do tej pory byłem w stanie zapisać wynik do pliku, który nie jest tym, czego szukam, a także byłem w stanie wyświetlić wynik w terminalu, ale chcę tylko przekazać wynik do zmiennej w tej chwili, aby Mogę pracować z tą zmienną.

echo "scale=2;$var1/var2" | bc
Shaolin
źródło

Odpowiedzi:

23

Jeśli używasz bash, lepiej użyj ciągu tutaj zamiast potoku, jak w:

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

Pozwoli ci to zaoszczędzić podpowłokę.

Następnie, aby zapisać dane wyjściowe polecenia, użyj podstawienia polecenia:

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

Edytować.

Jeśli chcesz czegoś jeszcze fajniejszego bc, oto dc (kalkulator odwrotnego polerowania):

answer=$(dc <<< "2k $var1 $var2/p")
gniourf_gniourf
źródło
1
Tak, używam bash, czy możesz wyjaśnić tę podpowłokę? Czy jest wada?
shaolin
2
Za każdym razem, gdy używasz potoku, |polecenie po prawej stronie potoku jest wykonywane w podpowłoce i wymaga zasobów do otwarcia nowej podpowłoki (to tak, jakby otworzyć nową instancję bash, aby wykonać to polecenie). Jeśli możesz tego uniknąć, unikaj go. Tutaj, rurociągi echosię bcbędzie uruchomić polecenie bcw podpowłoce i jest, w pewnym sensie, retarded (bez obrazy), ponieważ bash ma wspaniałą konstrukcję tutaj string <<<aby uniknąć głupich rzeczy jak te.
gniourf_gniourf
@gniourf_gniourf Z drugiej strony, jeśli troszczysz się o wykorzystanie zasobów, użyjesz /bin/sh(myślnik) zamiast bash, ale myślnik nie ma <<<.
Gilles „SO- przestań być zły”
Dziękuję za pomocne informacje !! To dobra informacja na temat ochrony zasobów i podpowłoki. Bardzo doceniam twój wkład.
shaolin
1
@Gilles po prostu porównaj time for i in {1..10000}; do : <<< ""; donez time for i in {1..10000}; do echo "" | : ; done, zobaczysz dramatyczną różnicę. Masz rację, heredok jest nieco szybszy niż herestring. Ale trudniej jest pisać w jednym wierszu.
gniourf_gniourf
9

Podstawienie polecenia przechowuje dane wyjściowe polecenia w zmiennej.

var3=$(echo "scale=2;$var1/$var2" | bc)
Gilles „SO- przestań być zły”
źródło
Dziękuję Ci! Doprowadziło mnie to dokładnie tam, gdzie chciałem być, po prawdopodobnie godzinie badań. Dzięki
shaolin,