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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top