自动化架构-shell自动化编程(二)
今日内容:
- Shell数学运算
- Shell逻辑判断
一、Shell数学运算
1.1 运算符
常用运算符:
shell-运算符 |
含义 |
+ |
加法符号 |
- |
减法符号 |
* |
乘法符号 |
/ |
除法符号 |
% |
取余 |
^或** 幂、指数 |
2^10=1024 10个2相乘. |
i=i+1 i++ |
计数,计算次数 |
j=j+5 j+=5 |
求和,累加 |
&& |
并且,前一个命令执行成功,再执行后面的命令(判断) |
|| |
或者,前一个命令执行失败了,再执行后面的命令(判断) |
实验:
1.2 运算方法(重要)
常用运算方法
运算的命令/符号 |
说明 |
应用场景 |
awk |
可以进行计算,带小数,可以与shell脚本进行变量传递 |
一般计算都可以用awk. |
bc |
带小数 |
一般计算都可以用bc.需要安装. |
expr |
进行计算,整数 |
一般用于检查输入内容是否为数字(方法之一). |
let |
进行计算,整数,变量直接使用即可 |
用于计算iՎҡ |
$(()) |
进行计算,整数,变量直接使用即可。 |
|
$[] |
进行计算,整数,变量直接使用即可。 |
|
1.2.1 使用awk计算(推荐)
小数正常,10/20正常显示0.5
基础用法
在awk中使用shell变量
提示:
awk -v选项用于创建或修改awk中的变量。
-v是shell脚本与awk桥梁
在awk中各种变量直接使用即可,不要加上$n1,如果加上了会被awk识别为取列
1.2.2 使用bc计算
加上-l选项,小数正常,10/20正常显示0.50000
熟悉基本使用方法
1.2.3 使用expr计算
小数异常,10 / 20 = 0
推荐用于判断变量是否是数字
用于计算坑很多,:
你以为就这些?还有个大坑!
案例:检测输入内容是否是数字
测试
实现原理:expr可以判断是不是整数
1.2.4 使用let进行计算
小数异常,10/20=0
基本使用
1.2.5 使用$(())进行计算
小数异常,10/20=0
基本使用
1.2.6 使用$[]进行计算
小数异常,10/20=0
基本用法,跟$(())类似
1.3 运算案例
案例1:计算器
参数传入脚本中2个参数,进行计算,输出结果,要求
实现:
测试
案例2:计算器改写
改成read读取参数
二、Shell逻辑判断
逻辑判断分为:
- 条件表达式:最基本的判断(核心)
- if判断:更加灵活
- case语句:适用于做选择
2.1 条件表达式
条件表达式,也叫条件测试语句,属于判断中的核心,if后面都在使用它
目标:
- 熟练掌握条件表达式的格式.
- 熟练使用条件表达式进行判断(文件,大小,与或非)
2.1.1 格式
格式如下
面试题:[]和[[]]的区别
含义与特点 |
test或[] |
[[]]或(()) |
共同点 |
都可以用于判断 |
都可以用于判断 |
区别1 |
不支持正则 |
[[]]支持正则 |
区别2 |
表示逻辑关系(与或非)符号不同 -a -o ! -gt |
[[ ]] && || ! > < <= >= |
应用场景 |
常见判断 |
使用正则[[]] 进行运算(()) |
2.1.2 判断文件
常用如下
条件表达式 |
说明 |
-f |
判断指定路径是否存在且为文件,是文件,返回true |
-d |
判断指定路径是否存在且为文件夹,是文件夹,返回true |
-x |
判断指定路径是否存在且具有可执行权限 |
-s |
判断指定文件是否存在且有内容(大小>0),非空为真 |
-r |
是否具有读权限 |
-w |
是否具有写权限 |
-nt |
newer than 对比两个文件修改时间,是否更新 |
-ot |
older than 对比两个文件修改时间,是否更老 |
-L |
是否是软连接 |
-e |
是否存在(任何文件类型) |
检测:文件是否存在
检测:目录是否存在
检测:是否有执行权限
检测:文件是否有内容
2.1.3 对比字符串
用于对比两个字符串的内容
对比选项 |
说明 |
“str1” = “str2” |
str1是否等于str2,相等为真 |
“str1” != “str2” |
str1是否不等于str2,不相等为真 |
-z “str” |
zero 检查str字符串是否是空的,空为真 |
-n “str” |
no zero 检查str字符串是否不是空的,非空(有内容)为真 |
对比两字符串是否相等
应用:判断程序是否是Root执行
企业级小技巧:在进行字符串比较的时候,变量尾巴加个x,防止变量为空,造成匹配/执行失败
检查字符串是否为空
2.1.4 比大小
常用:
- -eq:equal 等于
- -gt:greater than 大于
- -lt:less than 小于
比大小(整数) |
[] |
[[]] |
大于 |
-gt |
> |
大于等于 |
-ge |
>= |
小于 |
-lt |
< |
小于等于 |
-le |
<= |
等于 |
-eq |
== |
不等于 |
-ne |
!= |
不支持小数对比,仅支持整数
[]比较
[[]]比较
注意:
不推荐使用>=这种格式,对比的时候会有语法问题
这里面也可以用 -gt -lt …….
2.1.5 逻辑判断
与、或、非
逻辑判断 |
[] |
[[]] |
与 |
-a (and) |
&& |
或 |
-o (or) |
|| |
非 |
! |
! |
基本使用:
2.1.6 正则表达式
初步使用正则
案例:优化计算器脚本
加入正则判断参数是否为数字
2.2 if判断
应用:if一般与条件表达式一起使用,也可以直接加上命令.
目标:
- if判断适用于更加复杂的判断与检查
- if判断语句的格式
2.2.1 单分支判断,if…then
语法:
基本使用:
2.2.2 双分支判断,if..then..else
语法:
案例:检查根分区磁盘空间使用率
测试
2.2.3 多分支判断
语法
案例:
2.2.4 案例-输出指定用户的信息
温馨提示:这个脚本未来可以用于做安全检查
步骤:
- 执行脚本输入用户名(参数/read)
- 判断用户是否存在,如果不存在则提示用户不存在,退出脚本.
- 如果用户存在输出用户的信息
- 是否可以登录(命令解释器)
- uid,gid(过滤)
- 用户家目录
- 最近1次登录情况
输出样式:
实现:
测试
2.3 case语句
条件分支语句,一般用于实现有多种选择的脚本。
- 这个功能用if也能实现,不过使用case语句会更加清晰直观
- 如服务的状态:start|stop|restart|status
补充:
case的一个选项可以放多种组合,比如
2.2.1 案例1-某会所菜单展示
实现:
判断用户输入yes还是no
实现