Я пытаюсь записать сценарий удара, и я должен был сделать некоторые математические операции с плавающей точкой. В основном я хочу сделать что-то вроде этого:
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi
Проблемой, с которой я сталкиваюсь, является $? имеет тенденцию содержать вывод из программы эха а не до н.э вызов. Существует ли способ, которым я сохраняю вывод от до н.э программа в переменную?
Править:
Спасибо за быстрые ответы. Вот другой способ посмотреть на проблему. Скажите, что я изменил сценарий немного, таким образом, он похож на это:
#!/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"
output
$ ./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" прежде чем перейти к до н.э.
. например,
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: syntax error», будет выводиться на 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