Bash Scripting和bc

Lan*_*opp 11 bash scripting sh bc

我正在尝试编写一个bash脚本,我需要做一些浮点数学运算.基本上我想做这样的事情:

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

我遇到的问题是$?倾向于保持echo程序的输出而不是bc调用.有没有办法将bc程序的输出保存到变量中?

编辑:

感谢您的快速回复.这是另一种看待问题的方法.说我稍微修改了脚本,所以它看起来像这样:

#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
exit
fi
echo "$NUM"
Run Code Online (Sandbox Code Playgroud)

当用户输入正常的浮点值时,它可以正常工作:

bash script.sh 1.0
Run Code Online (Sandbox Code Playgroud)

输出:

.1000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

但是,当用户输入的值不正确时,脚本无法恢复:

bash script.sh 1.0a
Run Code Online (Sandbox Code Playgroud)

输出:

(standard_in) 1: parse error
Run Code Online (Sandbox Code Playgroud)

我想要做的就是让它优雅地退出.

gho*_*g74 8

我没有看到任何错误.$ NUM应该保存您的bc命令结果

看到:

NUM=$(echo "scale=25;$1/10" | bc)
echo "\$? is $?"
echo "NUM is $NUM"
Run Code Online (Sandbox Code Playgroud)

产量

$ ./shell.sh 10
$? is 0
NUM is 1.0000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用awk

NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }')
echo "\$? is $?"
echo "NUM is $NUM"
Run Code Online (Sandbox Code Playgroud)

另一种方法是在你转到之前检查"$ 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
Run Code Online (Sandbox Code Playgroud)

你不必检查$?bc