2009-08-10 12 views
21

Wiem, że to bardzo głupie pytanie, ale nie wiem, jak to zrobić w bashu:Jak używać wyrażenia w float?

20/30 * 100 

Powinno być 66.67 ale wyrażenie mówi 0, ponieważ nie obsługuje pływaka. Jakie polecenie w Linuksie może zastąpić wyrażenie i zrobić to równanie?

+1

smok, nie tykaj :) – lauriys

+0

Przepraszam, mea culpa, mea maxima! – smok1

+0

dla operacji matematycznych, spróbuj użyć bc lub awk, nie bash lub expr – ghostdog74

Odpowiedz

4

Jak podano w strona powłoki bash:

Powłoka umożliwia wyliczanie wyrażeń arytmetycznych w pewnych okolicznościach ... Oceny dokonywane są w liczbach całkowitych o stałej szerokości bez sprawdzania przepełnienia, chociaż dzielenie przez 0 jest uwięzione i oznaczone jako błąd.

można pomnożyć przez 100 wcześniej, aby uzyskać lepszy, częściowy wynik:

let j=20*100/30 
echo $j 

lub przez wielokrotności 10, i wyobrazić sobie miejsce dziesiętne, gdzie należy:

let j=20*10000/30 
echo $j 
+0

Może to pomóc, jeśli opublikowałeś rzeczywisty użyty wiersz poleceń.(Zgaduję, że użyłeś więcej zer niż ja.) Wykonałem powyższe komendy przed opublikowaniem i otrzymałem wyniki. Wypróbuj te najpierw. –

+0

niech j = 20 * 100/30 – lauriys

+0

Huh, dziwne, nie pamiętam wstawiania tam początkowo spacji. W każdym razie spróbuj usunąć spacje i powtórz. Edytowałem swój post, aby usunąć problematyczne białe znaki. –

27

bc zrobi to za Ciebie, ale kolejność jest ważna.

> echo "scale = 2; 20 * 100/30" | bc 
66.66 
> echo "scale = 2; 20/30 * 100" | bc 
66.00 

lub dla konkretnego przypadku:

> export ach_gs=2 
> export ach_gs_max=3 
> x=$(echo "scale = 2; $ach_gs * 100/$ach_gs_max" | bc) 
> echo $x 
66.66 

Niezależnie od wybranej metody, to jest gotowy do włączenia jako funkcji, aby ułatwić Ci życie:

#!/bin/bash 
function pct() { 
    echo "scale = $3; $1 * 100/$2" | bc 
} 

x=$(pct 2 3 2) ; echo $x # gives 66.66 
x=$(pct 1 6 0) ; echo $x # gives 16 
+0

, ale chcę to zrobić w skrypcie, pełna linia to: $ ach_gs/$ ach_gs_max * 100 – lauriys

+0

coś mniej skomplikowanego? – lauriys

+0

nie bardziej skomplikowane, łatwiejsze do zapamiętania! – lauriys

6

po prostu to zrobić w awk

# awk 'BEGIN{print 20/30 * 100}' 
66.6667 

zapisać go do zmiennej

# result=$(awk 'BEGIN{print 20/30 * 100}') 
# echo $result 
66.6667 
+0

awk jest najlepszy. – stu

+1

Ta odpowiedź jest bardzo niezręczna. – xdhmoore

13

ja zazwyczaj używają perla:

perl -e 'print 10/3' 
+0

musi to być bardzo podstawowy problem z perla, ale to polecenie wyświetla tylko pusty wiersz w moim systemie. 'perl -e 'print" hello world "" też nie działa. Ale 'perl -e 'print" hello world \ n "" 'działa zgodnie z oczekiwaniami. –

+2

Obawiam się, że nie mogę pomóc. Wszystko, co mogę zasugerować, to dodać "," \ n "" na końcu wyrażenia: 'perl -e 'print 10/3," \ n "'' – pgl

+0

Dzięki temu obejściu to działa. (a twoje polecenie działa "jak jest" w innym środowisku Linux) –

2
> echo "20/30 * 100" | bc -l 
66.66666666666666666600 

To uproszczenie Odpowiedź paxdiablo. -l ustawia skalę (liczba cyfr po przecinku) na 20. Ponadto ładuje bibliotekę matematyczną z funkcjami trygonalnymi i innymi rzeczami.

Powiązane problemy