如何在bash中使用浮点除法?
我试图在Bash脚本中划分两个图像宽度,但是bash给了我0的结果: 
 RESULT=$(($IMG_WIDTH/$IMG2_WIDTH)) 
 我没有学习Bash指南,我知道我应该使用bc ,在互联网的所有例子中,他们使用bc 。 在echo我试图把我的SCALE相同的东西,但它没有奏效。 
这里是我在教程中find的例子:
 echo "scale=2; ${userinput}" | bc 
 我怎样才能让Bash给我一个像0.5这样的float? 
 你不能。  bash 只是整数; 你必须委托给一个工具,如bc 。 
你可以这样做:
 bc <<< 'scale=2; 100/3' 33.33 
  更新 20130926 :你可以使用: 
 bc -l <<< '100/3' # saves a few hits 
庆典
 正如其他人所指出的那样, bash不支持浮点运算,尽pipe你可以用一些固定的十进制伪装来伪造它,例如有两位小数: 
 echo $(( 100 * 1 / 3 )) | sed 's/..$/.&/' 
输出:
 .33 
请参阅Nilfred的回答,以获得类似但更简洁的方法。
备择scheme
 除了提到的bc和awk替代品,还有以下几点: 
CLISP
 clisp -x '(/ 1.0 3)' 
清理输出:
 clisp --quiet -x '(/ 1.0 3)' 
或通过标准input:
 echo '(/ 1.0 3)' | clisp --quiet | tail -n1 
DC
 echo 2k 1 3 /p | dc 
天才cli计算器
 echo 1/3.0 | genius 
gnuplot的
 echo 'pr 1/3.' | gnuplot 
JQ
 echo 1/3 | jq -nf /dev/stdin 
要么:
 jq -n 1/3 
KSH
 echo 'print $(( 1/3. ))' | ksh 
LUA
 lua -e 'print(1/3)' 
或通过标准input:
 echo 'print(1/3)' | lua 
最大值
 echo '1/3,numer;' | maxima 
清理输出:
 echo '1/3,numer;' | maxima --quiet | sed -En '2s/[^ ]+ [^ ]+ +//p' 
节点
 echo 1/3 | node -p 
八度
 echo 1/3 | octave 
perl的
 echo print 1/3. | perl 
python
 echo print 1/3. | python 
[R
 echo 1/3 | R --no-save 
清理输出:
 echo 1/3 | R --vanilla --quiet | sed -n '2s/.* //p' 
ruby
 echo print 1/3.0 | ruby 
wcalc
 echo 1/3 | wcalc 
随着清理输出:
 echo 1/3 | wcalc | tr -d ' ' | cut -d= -f2 
zsh的
 echo 'print $(( 1/3. ))' | zsh 
其他来源
在Unix.SX上, StéphaneChazelas 回答了类似的问题 。
提高一点marvin的答案:
 RESULT=$(awk "BEGIN {printf \"%.2f\",${IMG_WIDTH}/${IMG2_WIDTH}}") 
BC并不总是作为安装包。
 你可以通过-l选项使用bc(L字母) 
 RESULT=$(echo "$IMG_WIDTH/$IMG2_WIDTH" | bc -l) 
作为bc的替代,你可以在你的脚本中使用awk。
例如:
 echo "$IMG_WIDTH $IMG2_WIDTH" | awk '{printf "%.2f \n", $1/$2}' 
在上面的“%.2f”告诉printf函数返回一个浮点数,小数点后两位数。 我使用echo作为字段的variablespipe道,因为awk正常运行。 “$ 1”和“$ 2”是指input到awk中的第一个和第二个字段。
你可以使用下面的命令来存储结果:
 RESULT = `echo ...` 
现在是尝试zsh(几乎)bash超集的最佳时机,还有许多其他漂亮function,包括浮点math。 以下是你的例子在zsh中的样子:
 % IMG_WIDTH=1080 % IMG2_WIDTH=640 % result=$((IMG_WIDTH*1.0/IMG2_WIDTH)) % echo $result 1.6875 
这个职位可能会帮助你: bash – 值得转换到ZSH休闲使用?
那么,在浮动之前是使用固定小数逻辑的时间:
 IMG_WIDTH=100 IMG2_WIDTH=3 RESULT=$((${IMG_WIDTH}00/$IMG2_WIDTH)) echo "${RESULT:0:-2}.${RESULT: -2}" 33.33 
最后一行是bashim,如果不使用bash,请尝试下面的代码:
 IMG_WIDTH=100 IMG2_WIDTH=3 INTEGER=$(($IMG_WIDTH/$IMG2_WIDTH)) DECIMAL=$(tail -c 3 <<< $((${IMG_WIDTH}00/$IMG2_WIDTH))) RESULT=$INTEGER.$DECIMAL echo $RESULT 33.33 
代码背后的基本原理是:除以100后得到2位小数。
有些情况下,你不能使用bc,因为它可能根本就不存在,就像在一些busybox或者embedded式系统的减less版本中一样。 在任何情况下,限制外部依赖总是一件好事,所以你总是可以给被数除以(分子)的数加0,就是乘以10的幂(你应该select10的幂)你需要的精度),这将使分区输出一个整数。 一旦你有这个整数对待它作为一个string,并定位小数点(从右向左移动)的次数等于十的乘方乘以分子的幂。 这是通过仅使用整数获得浮点数结果的简单方法。
这不是真正的浮点数,但是如果你想在bc的一个调用中设置多个结果的东西…
 source /dev/stdin <<<$(bc <<< ' d='$1'*3.1415926535897932384626433832795*2 print "d=",d,"\n" a='$1'*'$1'*3.1415926535897932384626433832795 print "a=",a,"\n" ') echo bc radius:$1 area:$a diameter:$d 
计算半径为1美元的圆的面积和直径