前言
沐风晓月带你学云原生开发,从零开始,我们出发,让知识学习不再难。
🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家
😉😉 💕 座右铭:先努力成长自己,再帮助更多的人,一起加油进步
🍺🍺🍺 💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘
可以关注我的云原生社区:云原生社区
也可以关注我的英语社区:从零开始学英语
一. 数据运算命令介绍
在shell环境中,我们可以使用的数据运算命令有:
-
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等你。