Bash Scripting и bc - PullRequest
       27

Bash Scripting и bc

11 голосов
/ 25 февраля 2010

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

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

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

РЕДАКТИРОВАТЬ:

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

#!/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

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

Ответы [ 3 ]

8 голосов
/ 25 февраля 2010

Я не вижу ничего плохого. $ 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

2 голосов
/ 25 февраля 2010

Для 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"
1 голос
/ 25 февраля 2010

Вы после результата расчета из bc (который вы храните в 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
...