前言

沐风晓月带你学云原生开发,从零开始,我们出发,让知识学习不再难。

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家
😉😉 💕 座右铭:先努力成长自己,再帮助更多的人,一起加油进步
🍺🍺🍺 💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

可以关注我的云原生社区云原生社区
也可以关注我的英语社区从零开始学英语

一. 数据运算命令介绍

在shell环境中,我们可以使用的数据运算命令有:

Shell脚本中的数值计算:使用数学运算实现数值操作-LMLPHP

  • expr:用于执行基本的算术和字符串操作。它支持常见的数学运算符,如加法、减法、乘法、除法和取模。例如,expr 5 + 2 将返回 7。

  • let:用于执行算术运算,包括基本的数学运算符、逻辑运算符和位运算符。它还支持自增和自减操作。例如,let “x = 5 + 2” 将将计算结果赋值给变量 x。

  • $(( )):双括号扩展是Shell的算术扩展。它支持数学运算符、逻辑运算符和位运算符。例如,result=$((5 + 2)) 将将计算结果赋值给变量 result。

  • bc:是一个高精度计算器语言。它可以执行复杂的数学计算,包括浮点数运算和数学函数。需要使用 echo 命令来将表达式传递给 bc。例如,echo “5 + 2” | bc 将返回 7。

  • awk:是一种强大的文本处理工具,也可以执行数学计算。它支持基本的数学运算符、内置数学函数和控制结构。例如,echo “5 + 2” | awk ‘{ print $1 + $2 }’ 将返回 7。

  • [] 这个也能用于数据运算,如:

[root@mufeng-69 ~]# a=3
[root@mufeng-69 ~]# b=4
[root@mufeng-69 ~]# result=$[a + b]
[root@mufeng-69 ~]# echo $result
7

二. 综合案例

2.1 let 的使用

使用方法:

注意:
let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

比如我们在猜数字游戏中:

#!/bin/bash
guess=20
n=0
while ((n < 3))

do
# 让用户输入一个数字
read -p "please input your num:" num
# 判断用户输入的数字与定义好的数字的大小
if [ $num -lt 20 ];then
        echo "your guess is too small"
elif [ $num -gt 20 ];then
        echo "your guess is too bigger"

elif [ $num -eq 20 ];then
        echo "succeed ,you are winer"

else 
        echo "please input a num"
fi
# 我们定义了只有三次机会,每次猜完都n+1
let n++
done

2.2 [ ]的使用

在Shell环境中,方括号 [] 可以用于进行一些基本的数据运算和数值比较。方括号内部可以包含数学表达式和比较表达式。

  • 数学运算:
加法:result=$(($a + $b))result=$[a + b]
减法:result=$(($a - $b))result=$[a - b]
乘法:result=$(($a * $b))result=$[a * b]
除法:result=$(($a / $b))result=$[a / b]
取余:result=$(($a % $b))result=$[a % b]
  • 数值比较:
相等:[ $a -eq $b ]
不等:[ $a -ne $b ]
大于:[ $a -gt $b ]
小于:[ $a -lt $b ]
大于等于:[ $a -ge $b ]
小于等于:[ $a -le $b ]

使用[]的案例:

[root@ecs-c13b ~]# result=$[ 1 + 2 ]
[root@ecs-c13b ~]# echo $result
3
[root@ecs-c13b ~]# NO1=5
[root@ecs-c13b ~]# result=$[ $NO1 + 5 ]
[root@ecs-c13b ~]# echo $result 
10
[root@ecs-c13b ~]# 

2.3 (())的使用

在Shell中,双圆括号 (( )) 是一种进行数学运算和数值比较的特殊结构,常用于Shell的算术扩展

  • 进行数学运算
x=5
y=3
result=$((x + y))
echo $result    # 输出:8
  • 变量赋值
x=5
((x = x + 3))
echo $x    # 输出:8
  • 数值比较: 可以使用双圆括号进行数值比较,并得到布尔值的结果。
x=5
y=3
((x > y)) && echo "x 大于 y" || echo "x 不大于 y"    # 输出:x 大于 y
  • 表示递增和递减
((x++))((x--))

案例实战:

#!/bin/bash

# 定义两个变量
x=10
y=5

# 执行数学运算并赋值给变量
result=$((x + y))

echo "x + y = $result"

# 变量递增操作
((x++))
echo "x++ = $x"

# 变量递减操作
((y--))
echo "y-- = $y"

# 数值比较
if ((x > y)); then
  echo "x 大于 y"
else
  echo "x 不大于 y"
fi

执行结果:

x + y = 15
x++ = 11
y-- = 4
x 大于 y

2.4 expr的使用

expr 是 Shell 环境中用于执行基本的数学运算和字符串操作的命令。它可以进行算术计算、字符串比较和提取子字符串等操作。

  • 算术运算:
加法:expr 5 + 2 将返回 7。
减法:expr 5 - 2 将返回 3。
乘法:expr 5 \* 2 将返回 10。注意乘法运算符 * 需要使用反斜杠 \ 进行转义。
除法:expr 10 / 2 将返回 5。
取模:expr 10 % 3 将返回 1
  • 字符串操作:
1.  字符串长度:expr length "Hello" 将返回 5,表示字符串 "Hello" 的长度。
2. 子字符串提取:expr substr "Hello, World" 8 5 将返回 "World",
   表示从第 8 个字符开始截取长度为 5 的子字符串。
  • 数值比较:
相等比较:expr 2 = 2 将返回 1,表示两个数值相等。
不等比较:expr 2 != 3 将返回 1,表示两个数值不相等。
大于比较:expr 5 \> 3 将返回 1,表示前者大于后者。
小于比较:expr 3 \< 5 将返回 1,表示前者小于后者。

注意:在使用 expr 进行数学计算时,数值和运算符之间需要有空格分隔,并且乘法运算符 * 需要使用反斜杠 \ 进行转义。在字符串操作和数值比较时,运算符和操作数之间也需要有空格分隔。

案例实战:

#!/bin/bash

# 定义两个变量
x=10
y=5

# 执行算术运算
sum=$(expr $x + $y)
difference=$(expr $x - $y)
product=$(expr $x \* $y)
quotient=$(expr $x / $y)
remainder=$(expr $x % $y)

echo "Sum: $sum"
echo "Difference: $difference"
echo "Product: $product"
echo "Quotient: $quotient"
echo "Remainder: $remainder"

# 执行字符串操作
string1="Hello,"
string2=" World!"
concatenated=$(expr "$string1" : '\(.*\)')$string2
substring=$(expr substr "$concatenated" 7 5)

echo "Concatenated: $concatenated"
echo "Substring: $substring"

# 执行数值比较
if expr $x '>' $y > /dev/null; then
  echo "x 大于 y"
else
  echo "x 不大于 y"
fi

2.5 bc的使用

bc是一个高级数据运算工具, 这个工具包含了计算器的很多选项和功能。

  • 基础运算
[root@ecs-c13b ~]# echo "4 * 0.5" |bc
2.0
[root@ecs-c13b ~]# echo "$NO1 * 0.5" |bc
2.5
  • 设置小数精度: scale
[root@ecs-c13b ~]# echo "scale=2;3/8"| bc
.37
[root@ecs-c13b ~]# echo "scale=2;3/7"| bc
.42
[root@ecs-c13b ~]# echo "scale=2;3/10"| bc
.30
  • 二进制和十进制转换
[root@ecs-c13b ~]# no=10
[root@ecs-c13b ~]# echo $no
10
[root@ecs-c13b ~]# echo "obase=2;$no" |bc
1010
十进制
[root@ecs-c13b ~]# no=10000011110000
[root@ecs-c13b ~]# echo $no
10000011110000
[root@ecs-c13b ~]# echo "obase=10; ibase=2;$no"|bc
8432
  • 计算平方根
[root@ecs-c13b ~]# test=zmgaosh1234567
[root@ecs-c13b ~]# echo $test
zmgaosh1234567
[root@ecs-c13b ~]# length=${#test}
[root@ecs-c13b ~]# echo $length
14

案例实战: 写一个计算器的脚本

#!/bin/bash

while true; do
  # 提示用户输入表达式
  read -p "请输入要计算的表达式 (输入 'q' 退出): " expression

  # 检查用户是否选择退出
  if [ "$expression" = "q" ]; then
    echo "感谢使用计算器!"
    break
  fi

  # 执行计算
  result=$(echo "$expression" | bc -l)

  # 输出结果
  echo "计算结果: $result"
  echo
done

执行结果:

root@mufeng-69 ~]# chmod +x a.sh 
[root@mufeng-69 ~]# ./a.sh 
请输入要计算的表达式 (输入 'q' 退出): 3+2
计算结果: 5

请输入要计算的表达式 (输入 'q' 退出): 3 * 3
计算结果: 9

请输入要计算的表达式 (输入 'q' 退出): 5/4
计算结果: 1.25000000000000000000

请输入要计算的表达式 (输入 'q' 退出): 

总结

shell脚本中的数学运算,在后面写shell脚本中经常使用,尤其是递增,递减,以及判断是否相等。

我是沐风晓月,我在csdn等你。
Shell脚本中的数值计算:使用数学运算实现数值操作-LMLPHP

06-21 01:44