前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >03·Shell编程-运算符

03·Shell编程-运算符

作者头像
DriverZeng
发布2022-09-26 10:43:30
3820
发布2022-09-26 10:43:30
举报
文章被收录于专栏:Linux云计算及前后端开发

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


运算符号

常用运算符号

+:加 -:减 *:乘 /:除 %:取余 ++:自增 --:自减

图一 · 曾老湿数学课堂开课了,孩子数学老不好,多半是废了。


余数的使用

代码语言:javascript
复制
## 1.使用RANDOM取随机数
[root@zabbix01 ~]# echo $RANDOM
27899

## 随机数的范围是 :man bash 可以查到 0 and 32767 总共32768个数
## 但是有时候,我想在一个范围内随机,例如,咱们班有100个学生,我想在100内随机抽取一名幸运观众。
## 那么就需要使用取余的方式来完成了。

[root@zabbix01 ~]# echo $((RANDOM%10))
9
[root@zabbix01 ~]# echo $((RANDOM%10))
7
[root@zabbix01 ~]# echo $((RANDOM%10))
5
[root@zabbix01 ~]# echo $((RANDOM%10))
4
[root@zabbix01 ~]# echo $((RANDOM%10))
9
[root@zabbix01 ~]# echo $((RANDOM%10))
8
[root@zabbix01 ~]# echo $((RANDOM%10))
6

自增的使用

代码语言:javascript
复制
# 一般在使用运算的时候,有时候会写 i=i+1那么我们就可以简写成 i++
# for循环中
for(i=1;i++;i<=10){
    这个循环就相当于,第一次循环的时候,i=1
    第二次循环的时候,i=i+1 也就是 i=1+1即 i=2
    第三次循环的时候,i=i+1 也就是 i=2+1即 i=3
    第四次循环的时候,i=i+1 也就是 i=3+1即 i=4
    第五次循环的时候,i=i+1 也就是 i=4+1即 i=5
    第六次循环的时候,i=i+1 也就是 i=5+1即 i=6
    ...
    一直循环到10,因为i给了一个最大范围是小于等于10
}

逻辑符号

常用逻辑符号

&&:且,前面的命令执行成功后,再执行后面的命令,前面的不成功,则后面的也不执行 ||:或,前面的命令执行不成功,才能执行后面的命令,前面的成功,则后面的不执行 !:非,取反

所有符号

符号

作用

+、-

加号,减号,一般用于整型、浮点型等类型的运算,其他语言中也可以做字符串的拼接

*、/、%

乘号、除号、取余,一般用于运算

**

幂运算

++、--

自增、自减,可前置也可后置,默认步长为1

&&、

<、<=、>= 、>

小于、小于等于、大于等于、大于

==、!=、=

等于,可用于数字和字符串、不等于、赋值

<<、>>

向左位移、向右位移

~、

、&、^

+=、-+、*=、/=、%=

赋值运算:a+=1 即 a=a+1 ... 依次类推

运算方式

方法一:(())

代码语言:javascript
复制
## 1.常规运算
[root@zabbix01 script]# echo $((1+1))
2
[root@zabbix01 script]# echo $((2**10))
1024

## 2.变量运算 
[root@zabbix01 script]# n1=111
[root@zabbix01 script]# n2=222
[root@zabbix01 script]# echo $((n1+n2))
333

## 3.运算赋值
# 方法一
[root@zabbix01 script]# n3=`echo $((n1*n2))`
[root@zabbix01 script]# echo $n3
24642

# 方法二
[root@zabbix01 script]# ((n4=n1*n2))
[root@zabbix01 script]# echo $n4
24642

不支持非整形

代码语言:javascript
复制
## 只要有小数,咋写都报错
[root@zabbix01 script]# echo $((2.5*4))
-bash: 2.5*4: syntax error: invalid arithmetic operator (error token is ".5*4")
[root@zabbix01 script]# echo $(( 2.5 *4 ))
-bash: 2.5 *4 : syntax error: invalid arithmetic operator (error token is ".5 *4 ")
[root@zabbix01 script]# echo $(( 2.5*4 ))
-bash: 2.5*4 : syntax error: invalid arithmetic operator (error token is ".5*4 ")
[root@zabbix01 script]# echo $(( 2.5 * 4 ))
-bash: 2.5 * 4 : syntax error: invalid arithmetic operator (error token is ".5 * 4 ")
[root@zabbix01 script]# a=2.5
[root@zabbix01 script]# b=4
[root@zabbix01 script]# echo $((a*b))
-bash: 2.5: syntax error: invalid arithmetic operator (error token is ".5")

方法二:let

代码语言:javascript
复制
[root@zabbix01 script]# let a=1+2
[root@zabbix01 script]# echo $a
3

[root@zabbix01 script]# i=1
[root@zabbix01 script]# let i++
[root@zabbix01 script]# echo $i
2
 
[root@zabbix01 script]# n=10
[root@zabbix01 script]# let n+=2
[root@zabbix01 script]# echo $n
12

不支持非整形

代码语言:javascript
复制
[root@zabbix01 ~]# let 2+2.5
-bash: let: 2+2.5: syntax error: invalid arithmetic operator (error token is ".5")

方法三:expr

代码语言:javascript
复制
## 错误写法
[root@zabbix01 script]# expr 2+2
2+2

## 正确姿势
[root@zabbix01 script]# expr 2 + 2
4

## 错误写法,因为*在bash里是通配符,所以echo一下就知道
[root@zabbix01 script]# expr 2 * 3
expr: syntax error
[root@zabbix01 ~]# echo expr 1 * 1
expr 1 zls.txt 1

## 正确姿势
[root@zabbix01 script]# expr 2 \* 3
6

## expr可以用来判断某一个数字是不是整型
# 如果变量是一个字符串
[root@zabbix01 ~]# age=xxx
[root@zabbix01 ~]# expr 1 + $age
expr: non-integer argument
[root@zabbix01 ~]# echo $?
2

# 如果变量是整型
[root@zabbix01 ~]# age=18
[root@zabbix01 ~]# expr 1 + $age
19
[root@zabbix01 ~]# echo $?
0

不支持非整形

代码语言:javascript
复制
[root@zabbix01 ~]# expr 1 + 2.5
expr: non-integer argument

方法四:bc

代码语言:javascript
复制
[root@zabbix01 ~]# echo 1+2 |bc
3
[root@zabbix01 ~]# echo 2.5+3 |bc
5.5

[root@zabbix01 ~]# echo 1/3 |bc
0
[root@zabbix01 ~]# echo 1/3 |bc -l
.33333333333333333333

## 它是交互式的
[root@zabbix01 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+1
2

## 在bc中幂运算,只能用 ^不能用 **,跟开发语言有关
2^10
1024

## 进制转换
# 十六进制
[root@zabbix01 ~]# echo 'obase=16;16'|bc
10
[root@zabbix01 ~]# echo 'obase=16;15'|bc
F
[root@zabbix01 ~]# echo 'obase=16;13'|bc
D

# 二进制
[root@zabbix01 ~]# echo 'obase=2;15'|bc
1111
[root@zabbix01 ~]# echo 'obase=2;18'|bc
10010

方法五:$[忘记他]

方法六:awk

代码语言:javascript
复制
## 支持多运算
[root@zabbix01 ~]# awk 'BEGIN{print 1+2,2**10}'
3 1024

## 直接显示小数
[root@zabbix01 ~]# awk 'BEGIN{print 1+2,2**10,2.5*3,1/3}'
3 1024 7.5 0.333333


## 变量运算
# 错误写法
[root@zabbix01 ~]# x=1
[root@zabbix01 ~]# y=2
[root@zabbix01 ~]# awk  'BEGIN{print x/y}'
awk: cmd. line:1: fatal: division by zero attempted

# 正确姿势
[root@zabbix01 ~]# awk -v x=1 -v y=2 'BEGIN{print x/y}'
0.5
# 那么我们就可以引用命令行的变量了
[root@zabbix01 ~]# awk -v x=$a -v y=$b 'BEGIN{print x/y}'
2

计算器案例

既然我们已经学习了那么多的计算方法,接下来我们就用shell实现一个计算器吧。

代码语言:javascript
复制
#!/bin/bash

























我不会
全剧终...
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运算符号
  • 逻辑符号
  • 所有符号
  • 运算方式
    • 方法一:(())
      • 方法二:let
        • 方法三:expr
          • 方法四:bc
            • 方法五:$[忘记他]
              • 方法六:awk
              • 计算器案例
              相关产品与服务
              运维安全中心(堡垒机)
              腾讯云运维安全中心(堡垒机)(Operation and Maintenance Security Center (Bastion Host))可为您的 IT 资产提供代理访问以及智能操作审计服务,为客户构建一套完善的事前预防、事中监控、事后审计安全管理体系,助力企业顺利通过等保测评。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档