举例说明bash中不同类型的算术操作

193 阅读4分钟

在bash中做算术运算与其他标准的编程语言不一样。bash的局限性之一是它不能像其他脚本语言那样处理浮点数或双数。在bash中使用了另一个命令工具来解决这个问题。在本教程中,通过不同的例子展示了不同类型的算术操作。

例1:使用 "expr "命令

在bash中进行算术运算的最古老的命令是'expr'。这个命令只能处理整数值,并且直接在终端打印输出。当你想使用'expr'命令进行任何数学运算时,你必须在每个操作数上使用空格。用下面的脚本创建一个名为expr.bash的bash文件,以了解'expr'命令的用法。

#!/bin/bash

# Works as the string
expr '10 + 30'

# Works as the string
expr 10+30

#Perform the addition
expr 10 + 30

#Find out the remainder value
expr 30 % 9

#Using expr with backtick
myVal1=`expr 30 / 10`
echo $myVal1  

#Using expr within command substitute
myVal2=$( expr 30 - 10 )
echo $myVal2

运行下面的命令来执行该脚本。

$ bash expr.bash

输出:
输出显示,只有当每个数字值都使用了空格,并且在expr命令中没有使用单引号时,算术运算符才发挥作用。你也可以将expr 命令的输出分配到一个变量中,然后通过使用回车键命令替代来打印这个变量。30/10的计算方法是使用回车键30-10的计算方法是使用命令替换

例子 - 2: 使用'let'命令

let是bash中另一个用于进行算术运算的内置命令。如果不把数值存储在一个变量中,**'let'命令就不能把输出打印到终端。但是'let'命令可以用来消除'expr'命令的其他限制。用下面的脚本创建一个名为let.bash的bash文件,以了解'let'**命令的用途。

#!/bin/bash

# Multiplying 9 by 8
let val1=9*3
echo $val1

# Dividing 8 by 3
let "val2 = 8 / 3"
echo $val2

# Subtracting 3 from 9
let val3=9-3
echo $val3

# Applying increment
let val4=7
let val4++
echo $val4

# Using argument value in arithmetic operation
let "val5=50+$1"
echo $val5

运行下面的命令来执行这个脚本。

$ bash let.bash 50

输出:

输出结果表明,'let'命令比'expr'命令更灵活。你可以评估任何带或不带引号的算术表达式。但是你不能在任何数学表达式中使用空格。在'let'命令中可以使用增量或减量运算符。本例最后部分显示了如何使用'let'命令对参数值进行算术运算。

例 3: 使用双括号

任何算术运算都可以在bash中完成,不需要使用任何命令。在这里,双括号被用来完成算术任务,使用双括号来执行数学表达式比'**expr'**或'let'等命令更灵活。创建一个名为dbl.bash的bash文件,其脚本如下,通过使用双括号测试算术运算。

#!/bin/bash
# Calculate the mathematical expression
val1=$((10*5+15))
echo $val1

# Using post or pre increment/decrement operator
((val1++))
echo $val1
val2=41
((--val2))
echo $val2

# Using shorthand operator
(( val2 += 60 ))
echo $val2

# Dividing 40 by 6
(( val3 = 40/6 ))
echo $val3

运行以下命令来执行该脚本。

$ bash dbl.bash

输出:

输出显示,双括号可以执行任何带空格或不带空格的数学表达式,你也可以在双括号表达式中使用增量/减量和速记运算符。

例4: 对浮点数或双数使用'bc'命令

上述在bash中进行算术运算的方法的一个主要限制是,'expr'或'let'或双括号表达式不能产生浮点数或双数。上述例子的除法运算的输出是整数。bc"命令可以用来解决这个问题,它可以作为Linux操作系统的一个基本计算器。用以下脚本创建一个名为bc.bash的bash文件,以了解**'bc'**命令在算术运算中的用途。

#!/bin/bash

# Dividing 55 by 3 with bc only
echo "55/3" | bc

# Dividing 55 by 3 with bc and -l option
echo "55/3" | bc -l

# Dividing 55 by 3 with bc and scale value
echo "scale=2; 55/3" | bc

运行下面的命令来执行该脚本。

$ bash bc.bash

输出:
输出显示,在执行任何除法表达式时,简单的'bc'命令会像其他选项一样产生整数值。bc -l'命令产生了除法的精确输出,你可以通过使用比例 值来限制小数部分。这里使用了scale=2。所以输出结果在小数点后显示2位数字。

例5:对浮点数或双数使用printf命令

`printf`命令是另一种处理小数数据的方法。在算术运算后,该命令可以比`bc`命令更有效地生成浮点数值。这个命令还可以用来计算一个数字的幂。本例中显示了`printf`命令在不同算术操作中的用途。创建一个名为prn.bash的bash文件,其脚本如下,以检查`printf`命令在两个数的除法的小数输出中的使用。

#!/bin/bash
# Take the dividend value from the user
read -p "Enter the dividend value: " n1
# Take the divisor value from the user
read -p "Enter the divisor value: " n2

# Find the division using `echo` and `bc`
echo "scale=2; $n1/$n2"|bc

# Find the division using `printf`
printf "%.2f\n" "$((10**2 * $n1/$n2))e-2"

运行下面的命令来执行该脚本。

$ bash prn.bash

输出:
下面的输出显示,两个整数的`bc`和`printf`命令产生的除数值是一样的。

下面的输出显示,当除数是一个浮点数时,那么`bc`命令产生的除数值是正确的,但是`printf`命令产生了一个错误。

创建一个名为prn2.bash的bash文件,其中包含以下脚本,以了解当红利值为浮点数时,使用`printf`命令可以获得正确的分数输出。

#!/bin/bash
# Take the dividend value from the user
read -p "Enter the dividend value: " n1
# Take the divisor value from the user
read -p "Enter the divisor value: " n2

# Find the division using `printf`, `echo` and `bc`
printf "%.2f\n" `echo $n1/$n2|bc -l`

运行以下命令来执行该脚本。

$ bash prn2.bash

输出:
输出显示`printf`与`bc`命令产生了正确的输出。

例6:使用awk命令进行算术操作

使用`awk`命令是另一种执行算术运算的方法,可以为浮点数产生正确的输出。本例中显示了使用`awk`命令进行无格式化和有格式化的算术运算。创建一个名为awk.bash的bash文件,用下面的脚本来检查使用`awk`命令进行算术运算的情况。

#!/bin/bash
# Initialize the dividend value
n1=90
# Initialize the divisor value
n2=43

# Print the output without formating
awk "BEGIN {print $n1/$n2}"
# Print the output with formatting
awk "BEGIN {printf "%.2f\n", $n1/$n2}"

运行下面的命令来执行该脚本。

$ bash awk.bash

输出:
输出显示,`awk`命令可以产生适当的分数输出。

例7:计算一个数值的百分比

有时我们需要计算特定标准的百分比值。在bash中可以通过使用`printf`命令和`echo`命令来计算百分比。假设,我们需要根据学生总数和通过的学生总数,找出考试通过的学生的百分比。这个问题的解决方案在本例中显示。创建一个bash文件,其中包含以下脚本,使用`printf`命令计算通过学生的百分比值。

#!/bin/bash
# Take the total number of students from the user
read -p "Total number of students: " total_std
# Take the total number of passed students from the user
read -p "Total number of passed students: " passed_std

# Calculate the percentage of passed students
printf "The percentage of passed students: %.2f%%\n" "$((10**3 * 100 * $passed_std/$total_std))e-3"

运行下面的命令来执行该脚本。

$ bash percentage.bash

输出:
输出显示了基于学生总数和通过学生的百分比。

结论

在本教程中,通过使用多个例子,展示了bash中不同算术运算符的用途以及使用不同命令进行算术运算的方法,以帮助bash用户。