Shell编程 - 运算篇
1. Shell表达式
表达式 | 示例 |
---|---|
[ expression ] | [ 1 -eq 1 ] |
[[ expression ]] | [[ 1 -eq 1 ]] |
test expression | test 1 -eq 1 ,等同于[] |
2. 整数比较符
比较符 | 描述 | 示例 |
---|---|---|
-eq,equal | 等于 | [ 1 -eq 1 ]为true |
-ne,not equal | 不等于 | [ 1 -ne 1 ]为false |
-gt,greater than | 大于 | [ 2 -gt 1 ]为true |
-lt,lesser than | 小于 | [ 2 -lt 1 ]为false |
-ge,greater or equal | 大于或等于 | [ 2 -ge 1 ]为true |
-le,lesser or equal | 小于或等于 | [ 2 -le 1 ]为false |
3. 整数运算符
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
^或** 幂、指数 | 2^10=1024 10个2相乘. |
i=i+1 i++ | 计数,计算次数 |
j=j+1 j+=1 | 求和,累加 |
&& | 并且,前一个命令执行成功,再执行后面的命令(判断) |
|| | 或者,前一个命令执行失败,再执行后面的命令(判断) |
随机的数字(n)对一个数字取余可以得到0到n-1范围的随机数。
echo $RANDOM%5 |bc
4.运算方法
命令 | 描述 | 示例 |
---|---|---|
awk | 可以进行计算,带小数,可以与shell脚本进行变量传递 | |
let | 赋值并运算,支持++、-- | let VAR=(1+2)*3 ; echo $VAR x=10 ; y=5 let x++;echo $x 每执行一次x加1 let y--;echo $y 每执行一次y减1 let x+=2 每执行一次x加2 let x-=2 每执行一次x减2 |
expr | 乘法*需要加反斜杠转义* | expr 1 * 2 运算符两边必须有空格 expr ( 1 + 2 ) * 2 使用双括号时要转义 |
bc | 计算器,支持浮点运算、平方等 | bc本身就是一个计算器,可直接输入命令,进入解释器。 echo 1 + 2 |bc 将管道符前面标准输出作为bc的标准输入 echo "1.2+2" |bc echo "10^10" |bc echo 'scale=2;10/3' |bc 用scale保留两位小数点 |
- awk进行计算
基础用法:
awk 'BEGIN{print 1/3}'
awk 'BEGIN{print 1/3*100}'
使用变量 -v
awk -vn1=1 -vn2=3 'BEGIN{print n1/n2}'
0.333333
awk -v选项用于创建或修改awk中的变量。-v是shell脚本与awk桥梁
在awk中各种变量直接使用即可,不要加上$n1,如果加上了会被awk识别为取列
- 由于Shell不支持浮点数比较,可以借助bc来完成需求:
- -l显示小数.
echo 1/3 |bc -l
echo 2^10 |bc -l
# echo "1.2 < 2" |bc
1
# echo "1.2 > 2" |bc
0
# echo "1.2 == 2.2" |bc
0
# echo "1.2 != 2.2" |bc
1
运算如果为真返回1,否则返回0,例子:
# [ $(echo "2.2 > 2" |bc) -eq 1 ] && echo yes || echo no
yes
# [ $(echo "2.2 < 2" |bc) -eq 1 ] && echo yes || echo no
no
- expr还可以对字符串操作:
- 使用注意事项:使用空格,对*号转义
[root@web01 ~]# expr 1+1 1+1 [root@web01 ~]# expr 1 + 1 2 [root@web01 ~]# expr 2 * 2 expr: 语法错误 [root@web01 ~]# expr 2 \* 2 4 [root@web01 ~]# expr 2 / 2 1
- 获取字符串长度:
# expr length "string" 6
- 截取字符串:
# expr substr "string" 4 6 ing
- 获取字符在字符串中出现的位置:
# expr index "string" str 1 # expr index "string" i 4
- 获取字符串开始字符出现的长度:
# expr match "string" s.* 6 # expr match "string" str 3
- 判断数字
检查是否为数字(整数) expr "$num1" + "$num2" + 666 &>/dev/null #0 1是正常 #2 3是异常 if [ $? -ge 2 ];then echo "Usage $0 num1 num2" exit 1 fi
- 使用注意事项:使用空格,对*号转义
- let,$(()), $[]
- 不支持小数,一般进行简单计算
- let
n1=666 n2=999 let c=n1+n2 这是用法 echo $c 1665 let i++
- $(())
n1=666 n2=999 echo $((n1+n2)) 1665 d=$((n1+n2)) echo $d 1665 这是用法 echo $((RANDOM%100)) 生成0-99随机数 echo $((RANDOM%100+1)) 生成1-100随机数
- $[]
n1=666 n2=999 e=$[n1+n2] echo $e 1665
案例1:print absolute value of an integer:⭐
root@web01:/service/scripts# cat int.sh
#!/bin/bash
read -p "请输入一个数字a:" a
if [ $a -ge 0 ];then
echo $a
else
echo $[-a] 或 $((-$a))
fi
案例2:计算器,传入脚本中2个参数,进行计算,输出结果。(传参)⭐
-
流程:
- 用户传入2个参数
- 判断是否为数字,如果不是,显示提示信息然后脚本结束.
- 计算,输出结果(awk,bc)
-
方式一:
-
方式二:
[root@web01 ~]# cat calc.sh
#!/bin/bash
m=0
read -p "请输入数字:" num1
if [[ ! "$num1" =~ ^[0-9]+$ ]];then
echo "请输入正确的数字"
exit
fi
read -p "请输入运算符:" a
for str in + - \* /
do
if [ "$str" = "$a" ];then
let m++
fi
done
[ $m -eq 0 ]&&{
echo "请输入正确的运算符"
exit
}
read -p "请输入数字:" num2
if [[ ! "$num2" =~ ^[0-9]+$ ]];then
echo "请输入正确的数字"
exit
fi
sum=$[ num1 $a num2 ]
echo $num1 $a $num2 的结果为:$sum
[root@web01 ~]#
[root@web01 ~]# bash calc.sh
请输入数字:a
请输入正确的数字
[root@web01 ~]# bash calc.sh
请输入数字:1
请输入运算符:a
请输入正确的运算符
[root@web01 ~]# bash calc.sh
请输入数字:1
请输入运算符:+
请输入数字:a
请输入正确的数字
[root@web01 ~]# bash calc.sh
请输入数字:1
请输入运算符:+
请输入数字:3
1 + 3 的结果为:4
分类:
Shell
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY