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

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")

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.