• 【Shell 脚本速成】05、Shell 运算详解


    目录

    一、赋值运算

    二、算术运算[四则运算]

    2.1 运算符与命令

    2.2 整形运算

    expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格

    let命令:只能做整数运算,且运算元素必须是变量,无法直接对整数做运算

    双小圆括号运算,在shell中(( ))也可以用来做数学运算

    2.3 浮点运算

    2.4 练习案例

    三、比较运算

    3.1 整形比较运算

    3.2 字符串比较运算

    3.2.1 字符串比较运算符

    3.2.2 比较两个字符串关系

    3.2.3 练习案例

    四、逻辑运算

    4.1 逻辑运算应用场景

    4.2 逻辑运算符

    4.3、练习案例

    4.3.1 写一个升级版的仿真用户登录系统。

    五、文件判断[文件类型、权限、新旧判断]

    5.1 test 判断命令


     

    计算机编程就是三大步:输入、运算、输出

    那么计算机运算有哪些呢,计算机能做哪些运算呢?

    我们来看看常见的计算机运算

    一、赋值运算

    赋值运算符等于号         "="

    把等号右边的数字或字符串等赋值给左边的变量。

    1. a=10
    2. name='baism'
    3. 重点:字符串必须用引号引起来

    二、算术运算[四则运算]

    2.1 运算符与命令

    四则运算符: + - * \ 【加减乘除】
    扩展: % ** 【取余 次方】

    运算命令:

    • 整形运算
      – expr
      – let
      – $(())
      – bc
    • 浮点运算
      – bc

    2.2 整形运算

    expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格

    1. [root@shell ~]# expr 100 + 3
    2. 103
    3. [root@shell ~]# expr 100 - 3
    4. 97
    5. [root@shell ~]# expr 100 * 3 # 注意 * 出现应该加 \ 转义字符,否则认为是通配符
    6. expr: 语法错误
    7. [root@shell ~]# expr 100 \* 3
    8. 300
    9. [root@shell ~]# expr 100 / 3
    10. 33
    11. [root@shell ~]# expr 100 % 3
    12. 1

    let命令:只能做整数运算,且运算元素必须是变量,无法直接对整数做运算

    1. # 运算符号两边不需要空格,且 * 不需要加 \ 转移字符
    2. [root@shell ~]# let a=100+3;echo $a
    3. 103
    4. [root@shell ~]# let a=100-3;echo $a
    5. 97
    6. [root@shell ~]# let a=100*3;echo $a
    7. 300
    8. [root@shell ~]# let a=100/3;echo $a
    9. 33
    10. [root@shell ~]# let a=100%3;echo $a
    11. 1
    12. [root@shell ~]# let a=100**3;echo $a
    13. 1000000
    14. # 变量的自增自减运算
    15. [root@shell ~]# a=100
    16. [root@shell ~]# let a++;echo $a # 等价于 a=$a+1
    17. 101
    18. [root@shell ~]# let a--;echo $a
    19. 100
    20. [root@shell ~]# let a-=3;echo $a # 等价于 a=$a-3
    21. 97
    22. [root@shell ~]# let a+=5;echo $a
    23. 102

    双小圆括号运算,在shell中(( ))也可以用来做数学运算

    1. [root@shell ~]# echo $((100+3))
    2. 103
    3. [root@shell ~]# echo $((100-3))
    4. 97
    5. [root@shell ~]# echo $((100*3))
    6. 300
    7. [root@shell ~]# echo $((100/3))
    8. 33
    9. [root@shell ~]# echo $((100%3))
    10. 1
    11. [root@shell ~]# echo $((100**3))
    12. 1000000

    2.3 浮点运算

    浮点运算是采用命令组合的方式来实现的:echo "scale=n;运算表达式" | bc

    1. # 使用 bc 文本计算器处理浮点运算,其中 scale=2 代表小数点保留两位
    2. [root@shell ~]# yum install -y bc
    3. # 组合命令
    4. [root@shell ~]# echo "scale=2;100/3" | bc
    5. 33.33

    2.4 练习案例

    内存使用率统计,要求打印内存使用率

    案例思考:

    1. 内存总量。获得方式:free         top         cat/proc/meminfo
    2. 内存使用量
    3. 内存使用率公式:使用量/总量*100%

    实现步骤:

    1. 获取内存总量
    2. 获取内存使用量
    3. 运算输出结果

    实现代码

    1. [root@shell ~]# vi memory_used.sh
    2. #!/bin/bash
    3. #Description:内存使用率计算脚本
    4. #1、获得内存总量
    5. memory_total=`free | grep -i "mem:" | tr -s " " | cut -d " " -f 2`
    6. #2、获得内存使用的量
    7. memory_used=`free | grep -i "mem:" | tr -s " " | cut -d " " -f 3`
    8. #3、计算输出
    9. #运算的时候是否需要小数点 浮点运算,要考虑使用的命令 (难点 重点)
    10. #echo "内存使用率: $((memory_used*100/memory_total))%"
    11. #难点:浮点运算中,同优先级,大数除以小数情况下,先乘后除,尽可能保证精确
    12. echo "内存使用率: `echo "scale=2;$memory_used*100/$memory_total" | bc`%"

    实现效果 

    三、比较运算

            计算机除了算术和赋值运算外,还有比较运算,比如说比较两个数的关系,比较两个字符串的关系【如在用户登录系统】等。接下来我们学习如何在shell中进行比较运算

    3.1 整形比较运算

    1. # 运算符解释:
    2. 精确比较:
    3. -eq 等于 equal
    4. -gt 大于
    5. -lt 小于
    6. 模糊比较:
    7. -ge 大于或等于
    8. -le 小于或等于
    9. -ne 不等于

    通过test命令比较两个整数关系

    1. # linux命令 test只能比较两个整数的关系,不会返回结果,需要通过$?才能看到结果;0true1false
    2. [root@shell ~]# test 100 -eq 3;echo $?
    3. 1
    4. [root@shell ~]# test 100 -eq 100;echo $?
    5. 0
    6. [root@shell ~]# test 100 -gt 3;echo $?
    7. 0
    8. [root@shell ~]# test 100 -lt 3;echo $?
    9. 1
    10. [root@shell ~]# test 100 -ge 3;echo $?
    11. 0
    12. [root@shell ~]# test 100 -le 3;echo $?
    13. 1
    14. [root@shell ~]# test 100 -ne 3;echo $?
    15. 0

    3.2 字符串比较运算

    3.2.1 字符串比较运算符

    1. # 运算符解释,注意字符串一定别忘了使用引号引起来
    2. == 等于
    3. != 不等于
    4. -n 检查字符串的长度是否大于0
    5. -z 检查字符串的长度是否为0

    3.2.2 比较两个字符串关系

    1. [root@shell ~]# test 'root' == 'root';echo $?
    2. 0
    3. [root@shell ~]# test 'root' == 'roo0t';echo $?
    4. 1
    5. [root@shell ~]# test 'root' != 'roo0t';echo $?
    6. 0
    7. [root@shell ~]# test -z 'root';echo $?
    8. 1
    9. [root@shell ~]# test -z '';echo $?
    10. 0
    11. [root@shell ~]# test -n '';echo $?
    12. 1
    13. [root@shell ~]# test -n '1';echo $?
    14. 0

    3.2.3 练习案例

    案例需求:
    模拟一个linux文本界面登陆程序,要求账号密码验证成功进入系统,账号密码验证失败退回登陆界面

    案例思考:

    1. 熟悉linux文本界面登陆步骤
    2. 熟悉字符串比较运算

    案例步骤:

    1. 预设正确账号、密码
    2. 输出提示登录信息并实现交互登录
    3. 输出密码输入信息并实现交互
    4. 判断输入是否正确
      4.1)正确,进入系统
      4.2)不正确 继续运行该脚本

    实现代码

    1. [root@shell ~]# vi login.sh
    2. #!/bin/bash
    3. #1. 设置默认密码
    4. default_account='root'
    5. default_pw='123456'
    6. #2. 清屏
    7. clear
    8. #3. 打印Linux登录信息
    9. echo "CentOS Linux 7 (Core)"
    10. echo -e "Kernel `uname -r` on `uname -m`"
    11. #4. 交互输入登陆名
    12. echo -n "$HOSTNAME login: "
    13. read account
    14. #5. 交互输入登录密码
    15. echo -n "password: "
    16. read -s -t 18 -n 16 pw
    17. echo
    18. #read -s -t 10 -p "Passwprd: " pw
    19. #echo
    20. #6. 判断用户输入是否正确
    21. if [ "$default_account" == "$account" ] && [ "$default_pw" == "$pw" ];then
    22. clear
    23. echo -e "\nwelcome to root"
    24. else
    25. echo "用户名或密码错误..."
    26. # 输入错误,则再次调用本脚本
    27. sh $0
    28. fi

    实现效果

    四、逻辑运算

            完成一个任务中需要多个条件都满足或者多个条件中只要满足一个即可,那么这就是我们的逻辑运算。通过多个条件判断结果,才能得出结论

    4.1 逻辑运算应用场景

    多条件同时判断

    4.2 逻辑运算符

    • ​ 逻辑与运算 &&
    • ​ 逻辑或运算 ||
    • ​ 逻辑非运算 !

    逻辑运算秘籍

    1. 逻辑运算注意事项:
    2. 逻辑与、或 运算都需要两个或以上条件
    3. 逻辑非运算只能一个条件。
    4. 口诀:
    5. 逻辑与运算 真真为真 真假为假 假假为假
    6. 逻辑或运算 真真为真 真假为真 假假为假
    7. 逻辑非运算 非假即真 非真即假
    8. 逻辑与或的短路运算:
    9. 逻辑与中靠前的条件中出现了假,后面的就不在判断了,因为已经是假的了
    10. 逻辑或中靠前的条件中出现了真,后不在往后判断了,结果已经为真了

    4.3、练习案例

            明白了逻辑运算符和逻辑运算的口诀和短路运算后,我们来通过练习加深理解,接下来我们来看一个案例。

            上一个字符串运算练习案例(3.2.3)中我们练习的是仿真用户登录,判断登陆的方式是分步判断的,既先判断用户名,不管是否正确都会继续判断密码的正确性,这样是两步判断,既然已知用户名是错误的啦,完全没必要在判断密码的正确性了,因为结果都一样,你不能进入系统。既然判断一个用户输入的用户名和密码是否正确,且一个不正确就不能进入系统,那么我们可以这么去思考一下:两个条件全为真则进入系统,两个条件一个为假则重新登陆。这样是不是就满足了逻辑与运算了,同时思考逻辑与运算的短路运算,逻辑与条件中的判断顺序是从前往后,前边一个条件为假的时候,后边的条件就不用判断了,那么就减少了判断的次数,加快了运算速度。你品!你细品!!是不是这个道理。

    4.3.1 写一个升级版的仿真用户登录系统。

    案例需求
    使用逻辑运算写一个仿真用户登录验证程序

    案例思路

    1. 输入用户名
    2. 输入密码
    3. 与运算返回结果

    案例代码

    1. #!/bin/bash
    2. echo "CentOS linux 7 (Core)"
    3. echo -e "Kernel `uname -r` on an `uname -m` \n"
    4. #1、输入用户名
    5. echo -n "$HOSTNAME login: "
    6. read myuser
    7. #2、输入密码
    8. read -p "password: " -s -t 20 -n 6 pw
    9. #3、与运算返回结果
    10. [ $myuser == 'root' ] && [ $pw == '123456' ] && echo "root 登录成功" || echo "用户名或密码错误"

    五、文件判断[文件类型、权限、新旧判断]

            linux的设计思路:一切皆文件,对文件系统的操作其实可以狭隘的理解为对文件的操作。如果希望对文件类型和权限或者两个文件做新旧或者是否同一个文件进行判断。

    5.1 test 判断命令

    命令功能: 检测文件类型和比较运算

    命令用法:test [命令选项] 表达式

    命令选项:

    1. -d 检查文件是否存在且为目录
    2. -e 检查文件是否存在
    3. -f 检查文件是否存在且为文件
    4. -r 检查文件是否存在且可读
    5. -s 检查文件是否存在且不为空
    6. -w 检查文件是否存在且可写
    7. -x 检查文件是否存在且可执行
    8. -O 检查文件是否存在并且被当前用户拥有
    9. -G 检查文件是否存在并且默认组为当前用户组
    10. -nt file1 -nt file2 检查file1是否比file2新(指创建日期)
    11. -ot file1 -ot file2 检查file1是否比file2
    12. -ef file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点(ls -il filename)
    13. # 以上只列出部分命令选项,详细的可以通过 man test 命令获得。

    命令用法练习

    1. # 文件类型判断
    2. [root@shell ~]# test -f /etc/passwd;echo $?
    3. 0
    4. [root@shell ~]# test -f /etc;echo $?
    5. 1
    6. [root@shell ~]# test -d /etc;echo $?
    7. 0
    8. # 文件权限判断
    9. [root@shell ~]# test -x /root/anaconda-ks.cfg ;echo $?
    10. 1
    11. [root@shell ~]# ll anaconda-ks.cfg
    12. -rw-------. 1 root root 1356 1021 14:54 anaconda-ks.cfg
    13. [root@shell ~]# test -r /root/anaconda-ks.cfg ;echo $?
    14. 0
    15. [root@shell ~]# test -w /root/anaconda-ks.cfg ;echo $?
    16. 0
    17. # 两个文件的判断
    18. [root@shell ~]# ls -il
    19. 34330826 -rw-r--r-- 1 root root 34 1122 16:45 test_02.sh
    20. 34330841 -rwxr-xr-x 1 root root 398 1122 13:51 test.sh
    21. [root@shell ~]# test test_02.sh -nt test.sh ;echo $?
    22. 0
    23. [root@shell ~]# test test_02.sh -ot test.sh ;echo $?
    24. 1
    25. [root@shell ~]# test test_02.sh -ef test.sh ;echo $?
    26. 1

    上一篇文章:【Shell 脚本速成】04、Shell 脚本格式化输出与用户交互_Stars.Sky的博客-CSDN博客 

    参考文档:shell运算详解-组团学

  • 相关阅读:
    【OpenStack云平台】Packmaker 集群
    [附源码]计算机毕业设计绿色生鲜Springboot程序
    FigDraw 12. SCI 文章绘图之相关性矩阵图(Correlation Matrix)
    Linux系统管理:虚拟机Kylin OS安装
    图的数据结构
    Redis 读写分离和哨兵机制
    物联网开发笔记(28)- 使用Micropython开发ESP32开发板之控制240x240的oled屏幕显示图片(ST7789芯片)
    数据仓库任务调度器-Azkaban | 案例测试<自动邮件报警通知机制>
    211. 添加与搜索单词 - 数据结构设计
    leetcode_1726 同积元组
  • 原文地址:https://blog.csdn.net/weixin_46560589/article/details/128005012