Вопрос
Я пытаюсь написать скрипт 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
Что я пытаюсь сделать, так это заставить его завершиться изящно.
Решение
Я не вижу ничего плохого.$ 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
больше
Другие советы
Для 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"
Вам нужен результат вычисления из 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