我在 Ubuntu 14.04.1 LTS 64 位 bash 命令提示符上有以下脚本:
S=0.030
F=0.150
N=10
reso=20
DIFF=`echo "scale=3; $F - $S" | bc -l`
df=`echo "scale=3; $DIFF / $N" | bc -l`
is=`echo "scale=3; $S / $df" | bc -l`
if=`echo "scale=3; $F / $df" | bc -l`
cd wgdisp-out
for i in `seq 0 $N`
do
f=`echo "scale=3; $S + $i * $df" | bc -l | awk ' sub("\\.*0+$","") '`
#h5totxt hsli0$f.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n '/^[[:digit:]]/p' | cut -d , -f 1
echo $f
done
我希望将 f 显示为0.03, 0.042, 0.054, .... 0.138, 0.15
,这很重要,因为 f 在文件名中使用,例如hsli0.03.h5
.有人能指出我正确的方向吗?我对 shell 中的算术不太熟悉。
编辑:我尝试了以下构造,但它没有产生所需的输出;此外,缩放选项bc
似乎不起作用。
f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./' -e 's/$^\/0/./'`
编辑2:使用以下单个命令即可使其工作:
f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./;s/[0]*$//g'`
答案1
中bc
,scale
是一个特殊变量,用于限制规模(逗号后的位数)某些运算符(例如/
(除法))的结果。它不是 所显示的数字的精度bc
,它用于计算。
例如,在 中scale=1; 1/3
,结果是0.3
( 3/10
),与 相差甚远1/3
。
您应该在计算中使用大比例值,并且仅在显示时减少(例如,最后scale
除以)。1
比较:
$ echo "scale=100; r=1/3*300; scale=3; r/1" | bc
99.999
和:
$ echo "scale=3; 1/3*300" | bc
99.900
我会这样写:
n=10
echo "
s = 0.030
f = 0.150
n = $n
r = 20
scale = 100
d = (f - s) / n
scale = 3
for (i = s; i <= f; i += d) i/1" |
bc |
sed 's/^\./0./;s/0*$//' |
while read f; do
h5totxt "hsli$f.h5" | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200
done
答案2
bash 中的浮点运算支持非常差。不过,您仍然可以使用printf
:
printf '%5.3f\n' $f
printf '%.3g\n' $f
如果您只想在 . 前面添加 0,则可以使用参数扩展:
f=${f/#./0.}
# if negative numbers are possible, too
f=${f/#-./-0.}