Domanda
Sto cercando di scrivere uno script bash e avevo bisogno di fare alcuni calcoli in virgola mobile.Fondamentalmente voglio fare qualcosa del genere:
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi
Il problema che sto riscontrando è $?tende a trattenere l'output del programma echo e non la chiamata bc.C'è un modo per salvare l'output dal programma bc in una variabile?
MODIFICARE:
Grazie per le risposte rapideEcco un altro modo di vedere il problema.Diciamo che ho modificato un po' lo script in modo che assomigli a questo:
#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
exit
fi
echo "$NUM"
Quando l'utente inserisce un normale valore in virgola mobile, funziona correttamente:
bash script.sh 1.0
produzione:
.1000000000000000000000000
Tuttavia, quando l'utente inserisce un valore errato, lo script non può ripristinare:
bash script.sh 1.0a
produzione:
(standard_in) 1: parse error
Quello che sto cercando di fare è farlo uscire con grazia.
Soluzione
Non vedo niente di sbagliato$NUM dovrebbe contenere il tuo bc
risultati del comando
Vedere:
NUM=$(echo "scale=25;$1/10" | bc)
echo "\$? is $?"
echo "NUM is $NUM"
produzione
$ ./shell.sh 10
$? is 0
NUM is 1.0000000000000000000000000
un altro modo è usare awk
NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }')
echo "\$? is $?"
echo "NUM is $NUM"
L'altro modo è fare il controllo di "$1" prima di passare a bc
.per esempio
shopt -s extglob
input="$1"
case "$input" in
+([0-9.]))
IFS="."; set -- $input
if [ $# -ne 2 ];then
echo "bad decimal"
else
NUM=$(echo "scale=25;$1/10" | bc )
echo "$NUM"
fi
esac
non devi controllare $?
da bc
più
Altri suggerimenti
Per GNU bc
, un errore simile a "(standard_in) 1: errore di sintassi" viene emesso su stderr. È possibile catturare questo nella vostra variabile e verificare la presenza di esso.
#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc 2>&1)
if [[ $NUM =~ error || $? -ne 0 ]]
then
echo bad
exit
fi
echo "$NUM"
Sei dopo il risultato del calcolo da bc (che si memorizzano in NUM) o il ritorno di stato dalla chiamata di sistema?
Come ho detto di avere il risultato del calcolo in $NUM
:
#bctest.sh
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi
echo "result: ", $NUM
Prova:
bash ./bctest.sh 15
result: , 1.5000000000000000000000000