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