我试图写一个bash脚本,我需要做一些浮点运算。基本上,我想要做这样的事情:

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

我遇到的问题是$?倾向于保持从回声程序的输出,而不是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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top