Czasami muszę podzielić jedną liczbę na drugą. Byłoby wspaniale, gdybym mógł po prostu zdefiniować funkcję bash. Do tej pory jestem zmuszony używać takich wyrażeń jak
echo 'scale=25;65320/670' | bc
ale byłoby świetnie, gdybym mógł zdefiniować funkcję .bashrc, która wyglądałaby
divide () {
bc -d $1 / $2
}
command-line
function
arithmetic
bashrc
bc
ixtmixilix
źródło
źródło
ksh
, wariant 93, obsługuje ciągi tutaj.Bash potrafi do pewnego stopnia matematykę. Jednak nie jest przydatna ze względu na dokładność, ponieważ zaokrągla.
Ale masz rację - funkcja bash byłaby prostym skrótem, a twój przykład w zasadzie działa.
Rzuć to w swoim .bashrc, a następnie możesz:
źródło
echo $((10 / 5))
nie wymaga cytatu.echo $((6383/7671))
da ci zero. Musisz wyraźnie mówić o liczbach zmiennoprzecinkowych:echo $((6383.0/7671.0))
Prawdopodobnie znasz bash wbudowany 'expr' jak w
który jest ograniczony do liczb całkowitych i wymaga spacji między argumentami.
Co powstrzymuje Cię przed zdefiniowaniem funkcji na podstawie wyrażenia echa, którego już używasz? To znaczy
źródło
Nie jest to właściwie odpowiedź na to dokładne pytanie, ale warto wiedzieć. Użyj
zsh
;-)źródło
expr
wbudowanego bash , więc mimo to dobra odpowiedź :)Jeśli
calc
zainstalowałeś w swoim systemie i nie lubisz zaokrąglania, możesz:źródło
apcalc
(Arbitary Precision) ... Plik binarny nazywa sięcalc
calc
.Brudny hack dla małych wartości i ograniczonej precyzji bez użycia bc polegałby na pomnożeniu nominatora przed podziałem, aby uzyskać dokładny wynik.
Przykład bez precyzji:
z dokładnością do 2 cyfr: pomnóż przez 100 i przesuń kropkę dziesiętną o 2 kroki w lewo:
Jest to przydatne tylko wtedy, gdy znany jest zakres liczb, a dokładność jest zawsze taka sama. Unikanie dzwonienia do bc i dzwonienie do sed nie wydaje się zbyt rozsądne.
Pamiętaj, że pomnożenie wartości może prowadzić do błędów przepełnienia, ale niezbyt wcześnie:
źródło
$[expression]
zamiastThe old format $[expression] is deprecated and will be removed in upcoming versions of bash.
Zamiast używać bc, możesz użyć awk:
źródło
źródło