13

我正在尝试编写一个 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

我想做的是让它优雅地退出。

4

3 回答 3

12

我看不出有什么不对。$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检查

于 2010-02-25T05:59:19.297 回答
2

对于 GNU bc,将在 stderr 上输出类似于“(standard_in) 1: syntax error”的错误。您可以在变量中捕获它并检查它。

#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc 2>&1)
if [[ $NUM =~ error || $? -ne 0 ]]
then
    echo bad
    exit
fi
echo "$NUM"
于 2010-02-25T07:46:35.390 回答
1

您是从 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
于 2010-02-25T06:01:54.937 回答