目录
硬编码
硬编码(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)