2009-08-10 10 views
21

Lo so che è veramente stupido domanda, ma non so come farlo in bash:Come usare expr su float?

20/30 * 100 

Va 66.67 ma espr sta dicendo 0, perché non supporta galleggiante. Quale comando in Linux può sostituire expr e fare questa equalizzazione?

+1

smok, nie tykaj :) – lauriys

+0

Mi dispiace, mea culpa, mea maxima! – smok1

+0

per operazioni matematiche, prova ad usare bc o awk, non bash o expr – ghostdog74

risposta

4

Come riportato nel la pagina man bash:

La shell consente di esprimere espressioni aritmetiche in determinate circostanze ... La valutazione viene eseguita in interi a larghezza fissa senza controllo per l'overflow, sebbene la divisione per 0 sia intrappolata e contrassegnata come un errore.

È possibile moltiplicare per 100 in precedenza per ottenere una migliore, risultato parziale:

let j=20*100/30 
echo $j 

O da una maggiore multiplo di 10, e immaginare la cifra decimale in cui essa appartiene:

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

Potrebbe essere utile se hai postato la riga di comando effettiva che hai usato.(Immagino che tu abbia usato più zeri di me.) Ho eseguito i comandi sopra prima di pubblicare i risultati e ho ottenuto i risultati. Per favore, prova quelli prima. –

+0

let j = 20 * 100/30 – lauriys

+0

Huh, strano, non ricordo di aver inserito gli spazi lì in origine. Ad ogni modo, prova a rimuovere i tuoi spazi e ripeti. Ho modificato il mio post per rimuovere lo spazio bianco problematico. –

27

bc farà questo per voi, ma l'ordine è importante.

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

o, per il vostro caso specifico:

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

Qualunque sia il metodo scelto, questo è maturo per l'inclusione come una funzione per rendere la vita più facile:

#!/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

ma voglio farlo in script, la linea completa è: $ ach_gs/$ ach_gs_max * 100 – lauriys

+0

qualcosa di meno complicato? – lauriys

+0

non più complicato, più facile da ricordare! – lauriys

6

Just do it in awk

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

salvarlo alla variabile

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

awk è il migliore. – stu

+1

Questa risposta è molto imbarazzante. – xdhmoore

13

Io generalmente uso perl:

perl -e 'print 10/3' 
+0

deve essere un problema perl molto semplice, ma questo comando mostra solo una riga vuota sul mio sistema. 'perl -e 'print" Hello world "" non funziona neanche. Ma 'perl -e 'print" ciao mondo \ n "" funziona come previsto. –

+2

Ho paura di non poter aiutare. Tutto quello che posso suggerire è aggiungere '," \ n "' alla fine dell'espressione: 'perl -e 'print 10/3," \ n "'' – pgl

+0

Grazie, questa soluzione funziona. (e il tuo comando funziona "così com'è" su un altro ambiente Linux) –

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

questa è una semplificazione della risposta da paxdiablo. Il -l imposta la scala (numero di cifre dopo il decimale) a 20. Carica anche una libreria matematica con funzioni trigonometriche e altre cose.