shell中浮点数计算方法

一、shell中数值计算方法

shell中常用的数值计算方法是使用运算符号:$(())

例如,使用命令:

1
echo $((5*6+1))

即会得到正确的计算结果。但是该方法存在的问题是不能对浮点数进行操作,如下:
在这里插入图片描述
可以看到当使用该运算符进行浮点数运算时会出错。

二、shell中浮点数计算方法

shell中浮点数计算主要有两个方法可以使用。

1、bc计算器

bc实际上是一种编程语言,该语言允许在命令行输入浮点表达式,然后执行,通常在linux下被用作计算器,提供常用的数学计算,包括:

  • + :加法
  • - :减法
  • * :乘法
  • / :除法
  • % :取余
  • ^ :幂运算
    使用bc计算器进行数值计算只需要在将表达式通过管道传递给计算器就能得到结果,使用非常方便。例如:
1
echo "5.6*3.2+6.7^2"|bc

同时bc计算器还支持自变量来计算,例如:
在这里插入图片描述

2、awk进行浮点运算(高级用法)

awk是一种处理文本文件的语言,内置在bash中,其对于结构化文本信息的提取非常有效。内置有丰富的函数,同时使用该命令同样可以实现复杂的数学计算,例如:
在这里插入图片描述

3、一些tips

相较于bc,使用awk进行浮点数计算优势更加明显,例如可以个性化指定输出,对于特殊数字的识别也更加有效。例如以下是遇到的一个问题:
在这里插入图片描述
可以看到对于计算带有符号的浮点数计算,awk同样可以胜任而使用bc命令会出错。
使用awk还需要注意一点是awk后面紧跟的函数命令注意要使用单引号而不是双引号,因为使用双引号会把$1 $2 $3参数解析成当前脚本的内部参数,而不是直接输出给函数来实现调用。
在这里插入图片描述
可以看到同样是提取文本的第一个单词,如果使用双引号会出错,输出整个文本,而使用单引号就可以得到正确的结果。

三、最后展示一个进行计算的脚本(改了很多遍才成功)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
b=`awk 'NR==4{print $2}' layer.vasp`
c=`awk 'NR==5{print $3}' layer.vasp`
step=12
ins=`echo 1.0 $step|awk '{printf("%f",$1/$2)}'`
for i in $(seq 0 12)
do
mkdir step$i
cd step$i
for j in 0 0.03 0.05 0.07 0.10 0.12 0.14 0.16 0.18 0.20 0.23 0.25 0.28 0.30 0.35 0.40
do
mkdir $j
cd $j
cp ../../layer.vasp .
dy=`echo $ins $i|awk '{printf("%f",$1*$2)}'`
for k in 9 12 15 16 17 18 19 24 25 26 29 30
do
x=`awk "NR==$k{print}" layer.vasp|awk '{print $1}'`
y=`awk "NR==$k{print}" layer.vasp|awk '{print $2}'`
z=`awk "NR==$k{print}" layer.vasp|awk '{print $3}'`
y=$(echo $y $dy|awk '{printf("%.10f",$1+$2)}')
if [ $(echo "$y>1.0"|bc) -eq 1 ]; then
y=$(echo $y 1.0|awk '{printf("%.10f",$1+$2)}')
fi
z=$(echo $z $j|awk '{printf("%.10f",$1+$2)}')
newline=`echo " $x +$y +$z"`
echo $newline
sed -i "$k c $newline" layer.vasp
done
cd ..
done
cd ..
done