Pytanie w sprawie command-line, divide, linux, math – Jak podzielić w konsoli Linux?

70

Mam do zmiennych i chcę znaleźć wartość jednego podzielonego przez drugiego. Jakich poleceń należy użyć, aby to zrobić?

Czy to naprawdę dotyczy programowania? [stackoverflow.com/faq] Frank V
@ frank-v Bash może być używany do programowania ... również, że link do faq nie działa chomp

Twoja odpowiedź

12   odpowiedzi
37
echo 5/2 | bc -l

opcja „-l” w „bc” pozwala na płynne wyniki

Fajne; z-l, domyślnie dostajesz 20 miejsc po przecinkui ładowana jest biblioteka matematyczna, która definiuje dodatkowe funkcje, takie jak sinus; aby jawnie określić liczbę miejsc dziesiętnych, dodaj wyrażenie za pomocąscale={numPlaces}; (też), jak wykazano w odpowiedzi @ user1504475. Innymi słowy:-l jest wygodną alternatywą dla określaniascale=20;, ale ma koszt wydajności z powodu ładowania biblioteki - jednak rzeczywisty wpływ wydaje się być nieistotny. mklement0
2

przez $ b:

echo $((a/b))
11

Nadal wolę używaćdc, który jest kalkulatorem RPN, tak by wyglądała szybka sesja dzielenia 67 przez 18 z 4-cyfrową precyzją

>dc
4k
67
18/p
3.7222
q
>

Oczywiście znacznie więcej dostępnych:człowiek dc

Kilka wskazówek, które mogą uratować podróżman: RPN = odwrotna notacja polska; w skrócie: najpierw wprowadzasz operandy, potem operatora. Zakończeniep jest potrzebny do wyprowadzenia wyniku. Nieinteraktywna wersja powyższych obliczeń:dc -e '4k 67 18 / p'. Uwaga: nie ustawianie precyzji (za pomocą{numPlaces}k) domyślnie 0, tj. podział całkowity. mklement0
8

jeśli nie potrzebujesz miejsc dziesiętnych w swojej dywizji, możesz to zrobić:

>echo $((5+6))
11
>echo $((10/2))
5
>echo $((10/3))
3
5

Konsola Linux masz na myśliGrzmotnąć.

JeśliX iY czy twoje zmienne,$(($X / $Y)) zwraca to, o co prosisz.

Nie potrzebujesz $ dla zmiennych Draemon
16

dowolnego kalkulatora precyzji.

variable=$(echo "OPTIONS; OPERATIONS" | bc)

dawny:

my_var=$(echo "scale=5; $temp_var/100 + $temp_var2" | bc)

gdzie „skala = 5” to dokładność.

man bc 

zawiera kilka przykładów użycia.

Fajne; jedna uwaga: nie ustawianiescale domyślnie jest to dzielenie całkowite - chyba że określisz-l, jak zauważa @raytrace poniżej, który domyślnie daje 20 miejsc po przecinku, ale także ładuje bibliotekę z dodatkowymi funkcjami. mklement0
11

awk który jest narzędziem / językiem przeznaczonym do ekstrakcji danych

na przykład dla 1.2 / 3.4

>echo 1.2 3.4 | awk '{ print $2/$1 }'
0.352941
2

co możesz zrobić za pomocą odpowiedzi raytrace. Możesz użyć stdout innego wywołania powłoki używając backticks, a następnie wykonać kilka obliczeń. Na przykład chciałem znać rozmiar pliku 100 wierszy z kilku plików. Oryginalny rozmiar zwc -c jest w bajtach, chcę znać kilobajty. Oto co zrobiłem:

echo `cat * | head -n 100 | wc -c` / 1024 | bc -l
1

Powinieneś spróbować użyć:

echo "scale=4;$variablename/3"|bc
-1

ale liczby dziesiętne nie są takie proste. jeśli masz 2 liczby, takie jak 3.14 i 2.35, a następnie podziel liczby, kod będzie dzielony =echo 3.14 / 2.35 | bc echo „$ Division” cytaty są różne. Nie bądź zdezorientowany, znajduje się tuż pod przyciskiem esc na klawiaturze. JEDYNA RÓŻNICA JEST | bc, a także echo działa jako operator do obliczeń arytmetycznych zamiast drukowania. Dodałem echo „$ Division” do drukowania wartości. Daj mi znać, jeśli to działa dla ciebie. Dziękuję Ci.

To nie są cytaty. Są ostre akcenty. Nie są wyświetlane, ponieważ StackOverflow używa ich do podświetlania fragmentów kodusome code here był po prostu owinięty ostrymi akcentami. Chris Sharp
Cytaty nie pojawiają się tutaj, więc po prostu umieść cudzysłowy (``) po = i po bc. SHIBLI
1

możesz także użyć perl -e

perl -e 'print 67/8'
65

W powłoce bash otaczaj wyrażenia arytmetyczne za pomocą$(( ... ))

$ echo $(( 7 / 3 ))
2

Chociaż myślę, że jesteś ograniczony do liczb całkowitych.

Tak, bash jest ograniczony do matematyki całkowitej. mkb

Powiązane pytania