Question
Je suis en train d'écrire un script bash et je devais faire quelques calculs à virgule flottante. Fondamentalement, je veux faire quelque chose comme ceci:
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi
Le problème que je suis en cours d'exécution en est $? tend à maintenir la sortie du programme d'écho et non l'appel bc. Est-il possible que je sauve la sortie du programme bc dans une variable?
EDIT:
Merci pour les réponses rapides. Voici une autre façon de regarder le problème. Dire que je modifié le script un peu il ressemble à ceci:
#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
exit
fi
echo "$NUM"
Lorsque l'utilisateur entre une valeur en virgule flottante normal, il fonctionne très bien:
bash script.sh 1.0
sortie:
.1000000000000000000000000
Cependant, lorsque l'utilisateur entre une valeur incorrecte, le script ne peut pas récupérer:
bash script.sh 1.0a
sortie:
(standard_in) 1: parse error
Ce que je suis en train de faire est d'obtenir pour sortir gracieusement.
La solution
Je ne vois rien de mal. $ NUM est censé contenir les résultats de la commande de bc
voir:
NUM=$(echo "scale=25;$1/10" | bc)
echo "\$? is $?"
echo "NUM is $NUM"
output
$ ./shell.sh 10
$? is 0
NUM is 1.0000000000000000000000000
Une autre façon est d'utiliser awk
NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }')
echo "\$? is $?"
echo "NUM is $NUM"
L'autre façon, est de faire le chèque de « $ 1 » avant de passer à bc
. par exemple,
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
vous n'avez pas à vérifier $?
de bc
plus
Autres conseils
Pour GNU bc
, une erreur similaire à "(standard_in) 1: erreur de syntaxe" sera sortie sur stderr. Vous pouvez capturer dans votre variable et vérifier pour elle.
#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc 2>&1)
if [[ $NUM =~ error || $? -ne 0 ]]
then
echo bad
exit
fi
echo "$NUM"
Êtes-vous après le résultat du calcul de la Colombie-Britannique (que vous enregistrez dans NUM) ou le retour de l'état de l'appel système?
Comme je l'ai dit que vous avez le résultat du calcul dans $NUM
:
#bctest.sh
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi
echo "result: ", $NUM
Test:
bash ./bctest.sh 15
result: , 1.5000000000000000000000000