目录
硬编码
硬编码的缺点
条件判断
$?
命令行语句
判断指定目录是否存在
判断指定文件是否存在
判断指定对象是否存在
表达式形式语句
判断对象是否存在
判断对象是否有权限
与、或、非 运算
与运算
或运算
非运算
比较大小
判断磁盘利用率实验步骤
字符串比较
逻辑表达式
if 语句
单分支结构
语法格式
语句原理
单分支if语句示例操作步骤
双分支结构
语法格式
语句原理
连通性测试实例操作步骤
多分支结构
语法格式
语句原理
多分支if语句示例操作步骤
case语句
语法格式
语句原理
case语句示例操作步骤
模拟sleep服务实例操作步骤
注册为系统服务调用脚本
服务管理方式
systemctl
service
硬编码
硬编码(Hard Coding)是指在程序代码中直接使用固定值,而不是通过变量、配置文件或参数来动态获取这些值
比如在脚本中写入一个ping命令,目标的IP地址固定为192.168.10.101(直接嵌入常量或固定逻辑),这就是硬编码
硬编码的缺点
- 难以维护:当需要修改硬编码的值时,需要直接修改源代码,并重新编译、部署应用。这增加了出错的风险和维护成本。
- 缺乏灵活性:硬编码使得程序在不同环境中运行时缺乏灵活性。例如,开发环境和生产环境的配置可能不同,如果使用硬编码,就需要为每个环境分别修改代码。
- 可读性和可管理性差:随着项目规模的增大,硬编码会导致代码难以阅读和管理,特别是当这些值分散在多个文件和模块中时。
条件判断
$?
检查上一个指令执行的结果状态
echo $?
如果状态正常就返回0
如果状态不正常就显示非0
命令行语句
判断指定目录是否存在
使用 test -d 目录路径 来判断指定目录是否存在
并使用echo $? 命令检测命令执行状态,非0表示不正常
判断指定文件是否存在
test -f 文件路径 判断文件是否存在
判断指定对象是否存在
表达式形式语句
判断对象是否存在
判断对象是否有权限
- -r:读权限
- -w:写权限
- -x:执行权限
与、或、非 运算
逻辑运算符
与运算
当前一个条件成立时,执行命令
示例:[ $USER = root ] && echo "当前用户为root"
解析:当用户为root时,在终端上输出“当前用户为root”
或运算
只要有一方的条件满足,就执行命令
如果两个文件只有file1存在那么结果为真(true),如果两个文件只有file2存在结果为真(true)
如果两个文件都不存在,结果为假(false)
if [ -f "$file1" ] || [ -f "$file2" ]; then
echo "文件存在!"
else
echo "文件不存在!"
fi
非运算
非运算会将 true 变为 false,将 false 变为 true
示例:[ ! -d /opt/test.txt ] && echo "该文件不是目录"
解析:如果指定的文件 不是目录,就在终端显示“该文件不是目录”
配合 = 就是 !=:不等于
示例:[ $USER != root ] && echo "当前用户不为root"
比较大小
运算符 | 说明 |
eq | 等于(equal) |
ne | 不等于(not equal) |
gt | 大于(greater) |
ge | 大于等于(greater or equal) |
lt | 小于(less) |
le | 小于等于(less or equal) |
判断磁盘利用率实验步骤
通过 df 命令 并使用 grep 管道符和 awk 获取根分区行内容的利用率的一列
再添加一个管道符 指定%为分隔符 结果只剩下利用率的数字
再将该命令的结果赋值给一个变量,接下来就可以做判断的操作了
通过表达式实现判断,可以看到结果是否,那么我们就可以通过判断的结果使用 if 语句来
字符串比较
使用表达式判断
需要注意的是,语法格式是有要求的
逻辑表达式
- &&(与运算):条件1 && 条件2
- 如果条件1执行成功,也执行条件2
if 语句
if:如果
如果判断的条件成立,就执行指定的命令
单分支结构
语法格式
语句原理
单分支if语句示例操作步骤
cd 到 /opt 目录下创建一个脚本文件
文件内容如下
新建一个用户并设置密码,然后登录该用户
使用tom的身份执行此脚本就成立了我们指定的条件(不是root用户),状态码也指定为了100
并且后续的 ls /opt命令没有执行,因为前一条语句没有执行成功
双分支结构
语法格式
语句原理
连通性测试实例操作步骤
新建编辑一个脚本文件
写入内容如下
指定ping命令的请求次数、间隔时间、超时时间,和添加位置参数
/dev/null 是“黑洞文件”,作用是任何写入到该文件的数据都会被丢弃,在当前脚本下的作用是丢弃标准输出和错误的输出信息,效果是不会在终端显示
测试执行该脚本,得到结果如下
如果在巡检时有上百上千台机器需要做连通性测试呢?
就可以编辑一个 主机列表 把所有主机的IP地址写进去,再将该列表引用到脚本里,让脚本通过该列表获取每个IP地址,逐个测试,实现自动化
多分支结构
语法格式
语句原理
多分支if语句示例操作步骤
新建编辑脚本文件,输入以下内容
保存并退出,测试该脚本
case语句
case:情况
语法格式
语句原理
case语句示例操作步骤
新建编辑脚本文件并写入以下内容
或通过 |(或运算),两个范围同时判断
模拟sleep服务实例操作步骤
新建编辑脚本文件输入以下内容
增加执行权限
需要注意的是使用相对路径时,在执行脚本内部的$0命令会找不到test03脚本文件,因为 $0 仅包含脚本名而不包含脚本文件的路径
而使用绝对路径调用时,$0就包含了调用文件时输入的绝对路径,所以在执行脚本内部的$0命令时就能找得到脚本文件了
注册为系统服务调用脚本
修改脚本文件,增加必须的规则(chkconfig)
35:开机自启的运行级别(3、5),也可以写为 "-" 表示所有运行级别
80:启动优先级(当系统启动时,开机自启的优先级,数字越大,优先级越低)
20:关闭优先级(关闭系统时,关闭服务的优先级)
再将文件拷贝到指定位置
在脚本中加入了chkconfig规则就可以通过chkconfig命令将脚本注册为系统服务
注册为系统服务后,就可以通过service命令对该服务进行操作
系统启动时自动运行该服务
服务管理方式
-
systemctl
- 串行启动
- 如果系统的守护进程是systemd,管理系统服务的就是 systemctl
- systemctl start|stop|restart|reload|status|enable|disable httpd
- systemctl 选项 服务名称
-
service
- 并行启动
- 如果系统的守护进程是init,管理系统服务的就是 service 管理(在CentOS 7往后,系统内的init是systemd的链接)
- service httpd start|stop|restart|reload|status
- service 服务名称 选项
- 通过chkconfig 服务名 on 将该服务设为开机自启
- 需要将脚本文件放置在 /etc/init.d/ 目录下
- 该脚本需要有执行权(chmod +x)