首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本和bc

Bash脚本和bc
EN

Stack Overflow用户
提问于 2010-02-25 13:50:20
回答 3查看 60.6K关注 0票数 13

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

代码语言:javascript
复制
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi

我遇到的问题是$吗?倾向于保存来自echo程序的输出,而不是bc调用。有没有办法将bc程序的输出保存到一个变量中?

编辑:

感谢您的快速回复。这是看待这个问题的另一种方式。假设我稍微修改了一下脚本,使其看起来像这样:

代码语言:javascript
复制
#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
exit
fi
echo "$NUM"

当用户输入一个正常的浮点值时,它工作得很好:

代码语言:javascript
复制
bash script.sh 1.0

输出:

代码语言:javascript
复制
.1000000000000000000000000

但是,当用户输入错误的值时,脚本将无法恢复:

代码语言:javascript
复制
bash script.sh 1.0a

输出:

代码语言:javascript
复制
(standard_in) 1: parse error

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-25 13:59:19

我看不出有什么问题。$NUM应该保存您的bc命令结果

请参见:

代码语言:javascript
复制
NUM=$(echo "scale=25;$1/10" | bc)
echo "\$? is $?"
echo "NUM is $NUM"

输出

代码语言:javascript
复制
$ ./shell.sh 10
$? is 0
NUM is 1.0000000000000000000000000

另一种方法是使用awk

代码语言:javascript
复制
NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }')
echo "\$? is $?"
echo "NUM is $NUM"

另一种方法是在传递给bc之前检查"$1“。例如

代码语言:javascript
复制
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检查$?

票数 12
EN

Stack Overflow用户

发布于 2010-02-25 15:46:35

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

代码语言:javascript
复制
#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc 2>&1)
if [[ $NUM =~ error || $? -ne 0 ]]
then
    echo bad
    exit
fi
echo "$NUM"
票数 2
EN

Stack Overflow用户

发布于 2010-02-25 14:01:55

您想要的是bc的计算结果(存储在NUM中)还是系统调用返回的状态?

正如我所说的,您有$NUM格式的计算结果

代码语言:javascript
复制
#bctest.sh
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi

echo "result: ", $NUM

测试:

代码语言:javascript
复制
bash ./bctest.sh 15
result: , 1.5000000000000000000000000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2331936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档