Bash 脚本和 bc

标签 bash scripting sh bc

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

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

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

最佳答案

我看不出有什么不妥。 $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"

另一种方法是在传递给 bc 之前检查“$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 检查 $?

关于Bash 脚本和 bc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2331936/

相关文章:

javascript - 使用jquery动态创建html元素

linux - 接受可选参数的 Shell 脚本

bash - 将绝对符号链接(symbolic link)转换为相对符号链接(symbolic link)

linux - 如何在 BASH 中将两个表相乘

linux - 上传文件到busybox机器

linux - 脚本计数文件的唯一记录

linux - shell脚本: when to test on the last command?

linux - 'output to stdout'是什么意思

android - 向 Android 应用程序添加脚本的最佳方式是什么?

windows - 使用参数运行exe文件的Powershell脚本