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)
我想要做的就是让它优雅地退出.
我没有看到任何错误.$ 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再
| 归档时间: |
|
| 查看次数: |
55895 次 |
| 最近记录: |