2010-02-25 7 views
9

Я пытаюсь написать сценарий bash, и мне нужно было сделать математику с плавающей запятой. В основном я хочу сделать что-то вроде этого:Bash Scripting и bc

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

Проблема, с которой я столкнулся, составляет $? имеет тенденцию удерживать вывод из эхо-программы, а не вызов bc. Есть ли способ сохранить вывод из программы bc в переменную?

EDIT:

Спасибо за быстрые ответы. Вот еще один способ взглянуть на проблему. Скажем, я изменил сценарий немного, так это выглядит следующим образом:

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

Когда пользователь вводит нормальное значение с плавающей запятой, он отлично работает:

bash script.sh 1.0 

выход:

.1000000000000000000000000 

Однако, когда пользователь вводит неверное значение, сценарий не может восстановиться:

bash script.sh 1.0a 

выход:

(standard_in) 1: parse error 

То, что я пытаюсь сделать, это получить его, чтобы выйти изящно.

ответ

6

Я не вижу ничего плохого. $ NUM предполагается провести ваши bc результаты команды

см:

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

выход

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

другой способ заключается в использовании AWK

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

Другой способ, это сделайте чек «$ 1», прежде чем перейти на bc. например

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 

вы не должны проверить $? от bc больше

+0

Помните, что успешное эхо «NUM - $ NUM» перезаписало значение в $? из команды $ (echo ... | bc). –

+0

Да, спасибо за исправление. – ghostdog74

+0

Я разъяснил свое сообщение выше. Спасибо за подсказку на awk. Если я не могу заставить bc работать, мне придется проверить это. – LandonSchropp

1

Вы после того, как результат расчета БЛ (которые хранятся в NUM) или возврата статуса из системного вызова?

Как я сказал, у вас есть результат расчета в $NUM:

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

echo "result: ", $NUM 

Тест:

bash ./bctest.sh 15 
result: , 1.5000000000000000000000000 
+0

Я пытался вернуть статус из системного вызова. Извините, я должен был быть более явным. – LandonSchropp

2

Для GNU bc, ошибки, подобной "(standard_in) 1: ошибка синтаксиса" будет выводиться на stderr. Вы можете зафиксировать это в своей переменной и проверить ее.

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