2010-02-25 17 views
9

Próbuję napisać skrypt basha i potrzebowałem trochę matematyki zmiennoprzecinkowej. Zasadniczo chcę zrobić coś takiego:Skrypty Bash i bc

NUM=$(echo "scale=25;$1/10" | bc) 
if [ $? -ne 0 ] 
then 
echo bad 
fi 

Problem, na który napotykam, to $? dąży do utrzymania wyjścia z programu echo, a nie wywołania bc. Czy istnieje sposób, w jaki zapisuję dane wyjściowe z programu bc do zmiennej?

EDIT:

Dzięki za szybkie odpowiedzi. Oto inny sposób patrzenia na problem. Powiedzieć, że zmodyfikowany skrypt trochę tak to wygląda następująco:

#!/bin/bash 
NUM=$(echo "scale=25;$1/10" | bc) 
if [ $? -ne 0 ] 
then 
echo bad 
exit 
fi 
echo "$NUM" 

Gdy użytkownik wprowadza normalną wartość zmiennoprzecinkową, to działa dobrze:

bash script.sh 1.0 

wyjściowa:

.1000000000000000000000000 

Jednak gdy użytkownik wprowadzi niepoprawną wartość, skrypt nie może odzyskać:

wyjściowa:

(standard_in) 1: parse error 

Co staram się zrobić, to dostać się wyjść z wdziękiem.

Odpowiedz

6

Nie widzę niczego złego. $ NUM ma trzymać bc wyniki poleceń

patrz:

NUM=$(echo "scale=25;$1/10" | bc) 
echo "\$? is $?" 
echo "NUM is $NUM" 

wyjście

$ ./shell.sh 10 
$? is 0 
NUM is 1.0000000000000000000000000 

Innym sposobem jest użycie awk

NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }') 
echo "\$? is $?" 
echo "NUM is $NUM" 

inny sposób, jest zrób czek "$ 1", zanim przejdziesz na bc. np

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 

nie masz do sprawdzenia $? z bc już

+0

Pamiętaj, że pomyślne echo "NUM jest $ NUM" spowoduje nadpisanie wartości w $? z polecenia "$ (echo ... | bc)". –

+0

tak, dzięki za poprawkę. – ghostdog74

+0

Wyjaśniłem mój post powyżej. Dzięki za wskazówkę na awk. Jeśli nie uda mi się przekonać bc do pracy, będę musiał to sprawdzić. – LandonSchropp

1

Czy jesteś po wyniku obliczeń z BC (który przechowywanych w NUM) lub powrotu stanu z wywołania systemowego?

Jak powiedziałem masz wynik obliczeń w $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 
+0

Próbowałem uzyskać zwrot statusu z wywołania systemowego. Przepraszam, powinienem być bardziej bezpośredni. – LandonSchropp

2

GNU bc, błędem podobnym do "(standard_in) 1: błąd składni" będzie być wyjściem na stderr. Możesz to uchwycić w swojej zmiennej i sprawdzić.

#!/bin/bash 
NUM=$(echo "scale=25;$1/10" | bc 2>&1) 
if [[ $NUM =~ error || $? -ne 0 ]] 
then 
    echo bad 
    exit 
fi 
echo "$NUM"