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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top