Come passare i risultati di bc a una variabile


15

Sto scrivendo una sceneggiatura e vorrei passare i risultati bcin una variabile. Ho dichiarato 2 variabili ( var1e var2) e ho dato loro dei valori. Nel mio script voglio passare i risultati da bcun'altra variabile in var3modo da poter lavorare con var3altri calcoli. Finora sono stato in grado di scrivere il risultato in un file che non è quello che sto cercando e inoltre sono stato in grado di fare eco al risultato nel terminale, ma al momento voglio solo passare il risultato a una variabile in modo che Posso lavorare con quella variabile.

echo "scale=2;$var1/var2" | bc

Risposte:


23

Se stai usando bash, è meglio usare una stringa qui invece di una pipe come in:

bc <<< "scale=2;$var1/$var2"

Questo ti farà risparmiare una subshell.

Quindi, per memorizzare l'output di un comando, utilizzare una sostituzione comando:

answer=$(bc <<< "scale=2;$var1/$var2")

Modificare.

Se vuoi qualcosa di ancora più bello di bc, ecco dc (calcolatore di inversione dello smalto):

answer=$(dc <<< "2k $var1 $var2/p")

1
Sì, sto usando bash, puoi chiarire la subshell? C'è uno svantaggio?
Shaolin,

2
Ogni volta che usi una pipe |il comando a destra della pipe viene eseguito in una subshell e ci vogliono risorse per aprire una nuova subshell (è come aprire una nuova istanza di bash per eseguire quel comando). Se puoi evitarlo, evitalo. Qui, il piping di un echoto bceseguirà il comando bcin una subshell ed è, in un certo senso, ritardato (senza offesa), poiché bash ha il meraviglioso costrutto qui-stringa <<<per evitare cose stupide come queste.
gniourf_gniourf,

@gniourf_gniourf Quindi, se ti preoccupassi dell'utilizzo delle risorse, useresti /bin/sh(trattino) invece di bash, ma trattino non ha <<<.
Gilles 'SO- smetti di essere malvagio' il

Grazie per le informazioni utili !! Questa è una buona informazione da sapere per quanto riguarda la conservazione delle risorse e dei subshells. Apprezzo molto il tuo contributo.
Shaolin,

1
@Gilles si confronta time for i in {1..10000}; do : <<< ""; donecon time for i in {1..10000}; do echo "" | : ; done, vedrai una differenza drammatica. Allora hai ragione, un heredoc è leggermente più veloce di un herestring. Ma è più imbarazzante digitare come una riga.
gniourf_gniourf,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.