目录
expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格
let命令:只能做整数运算,且运算元素必须是变量,无法直接对整数做运算
双小圆括号运算,在shell中(( ))也可以用来做数学运算
计算机编程就是三大步:输入、运算、输出
那么计算机运算有哪些呢,计算机能做哪些运算呢?
我们来看看常见的计算机运算
赋值运算符等于号 "="
把等号右边的数字或字符串等赋值给左边的变量。
- a=10
- name='baism'
-
- 重点:字符串必须用引号引起来
四则运算符: + - * \ 【加减乘除】
扩展: % ** 【取余 次方】
运算命令:
- [root@shell ~]# expr 100 + 3
- 103
- [root@shell ~]# expr 100 - 3
- 97
- [root@shell ~]# expr 100 * 3 # 注意 * 出现应该加 \ 转义字符,否则认为是通配符
- expr: 语法错误
- [root@shell ~]# expr 100 \* 3
- 300
- [root@shell ~]# expr 100 / 3
- 33
- [root@shell ~]# expr 100 % 3
- 1
- # 运算符号两边不需要空格,且 * 不需要加 \ 转移字符
- [root@shell ~]# let a=100+3;echo $a
- 103
- [root@shell ~]# let a=100-3;echo $a
- 97
- [root@shell ~]# let a=100*3;echo $a
- 300
- [root@shell ~]# let a=100/3;echo $a
- 33
- [root@shell ~]# let a=100%3;echo $a
- 1
- [root@shell ~]# let a=100**3;echo $a
- 1000000
-
- # 变量的自增自减运算
- [root@shell ~]# a=100
- [root@shell ~]# let a++;echo $a # 等价于 a=$a+1
- 101
- [root@shell ~]# let a--;echo $a
- 100
- [root@shell ~]# let a-=3;echo $a # 等价于 a=$a-3
- 97
- [root@shell ~]# let a+=5;echo $a
- 102
- [root@shell ~]# echo $((100+3))
- 103
- [root@shell ~]# echo $((100-3))
- 97
- [root@shell ~]# echo $((100*3))
- 300
- [root@shell ~]# echo $((100/3))
- 33
- [root@shell ~]# echo $((100%3))
- 1
- [root@shell ~]# echo $((100**3))
- 1000000
浮点运算是采用命令组合的方式来实现的:echo "scale=n;运算表达式" | bc
- # 使用 bc 文本计算器处理浮点运算,其中 scale=2 代表小数点保留两位
- [root@shell ~]# yum install -y bc
-
- # 组合命令
- [root@shell ~]# echo "scale=2;100/3" | bc
- 33.33
案例思考:
实现步骤:
实现代码
- [root@shell ~]# vi memory_used.sh
- #!/bin/bash
- #Description:内存使用率计算脚本
-
- #1、获得内存总量
- memory_total=`free | grep -i "mem:" | tr -s " " | cut -d " " -f 2`
-
- #2、获得内存使用的量
- memory_used=`free | grep -i "mem:" | tr -s " " | cut -d " " -f 3`
-
- #3、计算输出
- #运算的时候是否需要小数点 浮点运算,要考虑使用的命令 (难点 重点)
- #echo "内存使用率: $((memory_used*100/memory_total))%"
- #难点:浮点运算中,同优先级,大数除以小数情况下,先乘后除,尽可能保证精确
- echo "内存使用率: `echo "scale=2;$memory_used*100/$memory_total" | bc`%"
实现效果
计算机除了算术和赋值运算外,还有比较运算,比如说比较两个数的关系,比较两个字符串的关系【如在用户登录系统】等。接下来我们学习如何在shell中进行比较运算
- # 运算符解释:
-
- 精确比较:
- -eq 等于 equal
- -gt 大于
- -lt 小于
- 模糊比较:
- -ge 大于或等于
- -le 小于或等于
- -ne 不等于
通过test命令比较两个整数关系
- # linux命令 test只能比较两个整数的关系,不会返回结果,需要通过$?才能看到结果;0为true,1为false
- [root@shell ~]# test 100 -eq 3;echo $?
- 1
- [root@shell ~]# test 100 -eq 100;echo $?
- 0
- [root@shell ~]# test 100 -gt 3;echo $?
- 0
- [root@shell ~]# test 100 -lt 3;echo $?
- 1
- [root@shell ~]# test 100 -ge 3;echo $?
- 0
- [root@shell ~]# test 100 -le 3;echo $?
- 1
- [root@shell ~]# test 100 -ne 3;echo $?
- 0
- # 运算符解释,注意字符串一定别忘了使用引号引起来
- == 等于
- != 不等于
- -n 检查字符串的长度是否大于0
- -z 检查字符串的长度是否为0
- [root@shell ~]# test 'root' == 'root';echo $?
- 0
- [root@shell ~]# test 'root' == 'roo0t';echo $?
- 1
- [root@shell ~]# test 'root' != 'roo0t';echo $?
- 0
- [root@shell ~]# test -z 'root';echo $?
- 1
- [root@shell ~]# test -z '';echo $?
- 0
- [root@shell ~]# test -n '';echo $?
- 1
- [root@shell ~]# test -n '1';echo $?
- 0
案例需求:
模拟一个linux文本界面登陆程序,要求账号密码验证成功进入系统,账号密码验证失败退回登陆界面
案例思考:
案例步骤:
实现代码
- [root@shell ~]# vi login.sh
- #!/bin/bash
-
- #1. 设置默认密码
- default_account='root'
- default_pw='123456'
-
- #2. 清屏
- clear
-
- #3. 打印Linux登录信息
- echo "CentOS Linux 7 (Core)"
- echo -e "Kernel `uname -r` on `uname -m`"
-
- #4. 交互输入登陆名
- echo -n "$HOSTNAME login: "
- read account
-
- #5. 交互输入登录密码
- echo -n "password: "
- read -s -t 18 -n 16 pw
- echo
-
- #read -s -t 10 -p "Passwprd: " pw
- #echo
-
- #6. 判断用户输入是否正确
- if [ "$default_account" == "$account" ] && [ "$default_pw" == "$pw" ];then
- clear
- echo -e "\nwelcome to root"
- else
- echo "用户名或密码错误..."
- # 输入错误,则再次调用本脚本
- sh $0
- fi
实现效果
完成一个任务中需要多个条件都满足或者多个条件中只要满足一个即可,那么这就是我们的逻辑运算。通过多个条件判断结果,才能得出结论
多条件同时判断
逻辑运算秘籍
- 逻辑运算注意事项:
- 逻辑与、或 运算都需要两个或以上条件
- 逻辑非运算只能一个条件。
- 口诀:
- 逻辑与运算 真真为真 真假为假 假假为假
- 逻辑或运算 真真为真 真假为真 假假为假
- 逻辑非运算 非假即真 非真即假
-
-
- 逻辑与或的短路运算:
- 逻辑与中靠前的条件中出现了假,后面的就不在判断了,因为已经是假的了
- 逻辑或中靠前的条件中出现了真,后不在往后判断了,结果已经为真了
明白了逻辑运算符和逻辑运算的口诀和短路运算后,我们来通过练习加深理解,接下来我们来看一个案例。
上一个字符串运算练习案例(3.2.3)中我们练习的是仿真用户登录,判断登陆的方式是分步判断的,既先判断用户名,不管是否正确都会继续判断密码的正确性,这样是两步判断,既然已知用户名是错误的啦,完全没必要在判断密码的正确性了,因为结果都一样,你不能进入系统。既然判断一个用户输入的用户名和密码是否正确,且一个不正确就不能进入系统,那么我们可以这么去思考一下:两个条件全为真则进入系统,两个条件一个为假则重新登陆。这样是不是就满足了逻辑与运算了,同时思考逻辑与运算的短路运算,逻辑与条件中的判断顺序是从前往后,前边一个条件为假的时候,后边的条件就不用判断了,那么就减少了判断的次数,加快了运算速度。你品!你细品!!是不是这个道理。
案例需求
使用逻辑运算写一个仿真用户登录验证程序
案例思路
案例代码
- #!/bin/bash
- echo "CentOS linux 7 (Core)"
- echo -e "Kernel `uname -r` on an `uname -m` \n"
-
- #1、输入用户名
- echo -n "$HOSTNAME login: "
- read myuser
-
- #2、输入密码
- read -p "password: " -s -t 20 -n 6 pw
-
- #3、与运算返回结果
- [ $myuser == 'root' ] && [ $pw == '123456' ] && echo "root 登录成功" || echo "用户名或密码错误"
linux的设计思路:一切皆文件,对文件系统的操作其实可以狭隘的理解为对文件的操作。如果希望对文件类型和权限或者两个文件做新旧或者是否同一个文件进行判断。
命令功能: 检测文件类型和比较运算
命令用法:test [命令选项] 表达式
命令选项:
- -d 检查文件是否存在且为目录
- -e 检查文件是否存在
- -f 检查文件是否存在且为文件
- -r 检查文件是否存在且可读
- -s 检查文件是否存在且不为空
- -w 检查文件是否存在且可写
- -x 检查文件是否存在且可执行
- -O 检查文件是否存在并且被当前用户拥有
- -G 检查文件是否存在并且默认组为当前用户组
- -nt file1 -nt file2 检查file1是否比file2新(指创建日期)
- -ot file1 -ot file2 检查file1是否比file2旧
- -ef file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点(ls -il filename)
-
- # 以上只列出部分命令选项,详细的可以通过 man test 命令获得。
命令用法练习
- # 文件类型判断
- [root@shell ~]# test -f /etc/passwd;echo $?
- 0
- [root@shell ~]# test -f /etc;echo $?
- 1
- [root@shell ~]# test -d /etc;echo $?
- 0
-
- # 文件权限判断
- [root@shell ~]# test -x /root/anaconda-ks.cfg ;echo $?
- 1
- [root@shell ~]# ll anaconda-ks.cfg
- -rw-------. 1 root root 1356 10月 21 14:54 anaconda-ks.cfg
- [root@shell ~]# test -r /root/anaconda-ks.cfg ;echo $?
- 0
- [root@shell ~]# test -w /root/anaconda-ks.cfg ;echo $?
- 0
-
- # 两个文件的判断
- [root@shell ~]# ls -il
- 34330826 -rw-r--r-- 1 root root 34 11月 22 16:45 test_02.sh
- 34330841 -rwxr-xr-x 1 root root 398 11月 22 13:51 test.sh
- [root@shell ~]# test test_02.sh -nt test.sh ;echo $?
- 0
- [root@shell ~]# test test_02.sh -ot test.sh ;echo $?
- 1
- [root@shell ~]# test test_02.sh -ef test.sh ;echo $?
- 1
上一篇文章:【Shell 脚本速成】04、Shell 脚本格式化输出与用户交互_Stars.Sky的博客-CSDN博客
参考文档:shell运算详解-组团学