2010-03-31 11 views

risposta

9

in gusci, come zsh/ksh, è possibile utilizzare i galleggianti per la matematica. Se avete bisogno di più potenza di matematica, utilizzare strumenti come bc/awk/dc

esempio

var=$(echo "scale=2;3.4+43.1" | bc) 
var=$(awk 'BEGIN{print 3.4*43.1}') 

guardando a ciò che si sta cercando di fare

awk '{printf "%.2f\n",$0/59.5}' ball_dropping_times >bull_velocities 
+0

Elegante, grazie. – hhh

+0

qualche idea su un segno di commento per AWk? Se voglio avere un formato esplicitamente dichiarato per le mie misurazioni? Leggere solo le colonne può essere fonte di confusione. – hhh

+0

non capisco. mostra cosa intendi con esempi nella tua domanda – ghostdog74

3

molti modi - più portatile è quello di utilizzare il comando expr:

expr 3 + 3 
54
echo $((3+3)) 
4

Usa può fare uso del comando expr come:

expr 3 + 3 

Per memorizzare il risultato in una variabile si può fare:

sum=$(expr 3 + 3) 

o

sum=`expr 3 + 3` 
+0

vorrei aggiungere (dato che questo post è a quanto pare per i principianti Unix) che i backticks su l'ultima riga sono così il guscio valuta 'epr 3 + 3' prima somma viene assegnato. –

21

expr è il modo standard, ma gestisce solo numeri interi.

bash ha un paio di estensioni, che gestire solo interi così:

$((3+3)) returns 6 
((3+3)) used in conditionals, returns 0 for true (non-zero) and 1 for false 
let 3+3 same as (()) 

let e (()) possono essere utilizzati per assegnare valori, ad esempio

let a=3+3 
((a=3+3)) 

per virgola mobile è possibile utilizzare bc

eco 3 + 3 | bc

1

risolti grazie a Dennis, un esempio di BC-uso:

$ cat calc_velo.sh 

#!/bin/bash 

for i in `cat ball_dropping_times` 
do 
echo "scale=20; $i/59.5" | bc 
done > ball_velocities 
+0

metti questo nella tua domanda. inoltre, puoi semplicemente usare un comando awk. Analizza i file e si occupa della matematica decimale. guarda la mia risposta – ghostdog74

+1

Si sta utilizzando l'operatore di reindirizzamento '>' che tronca (sovrascrive) il file di destinazione ogni volta. Cambialo all'operatore append '>>' o metti il ​​reindirizzamento dopo 'done' invece che dopo' bc' in questo modo: 'done> ball_velocities'. –

2

Credo che il metodo ((3 + 3)) sia il più rapido in quanto è interpretato dal shell piuttosto che un binario esterno. volta che un ciclo di grandi dimensioni utilizzando tutti i metodi suggeriti per la più efficiente.

+0

* I processi nix sono progettati per essere estremamente leggeri e veloci proprio per questo motivo. Quindi usare i binari esterni non è così lento considerando le prestazioni complessive degli script di usi comuni. – SkyDan