一.目标
掌握语法:变量,环境变量,判断,循环,函数
案例:
- 定时巡检脚本
- 安装部署脚本
- 手动安装记录流程
- 书写脚本,自动化完成
- 服务管理脚本
- 未来推荐直接使用systemctl即可
- 无法直接使用,需要书写脚本
- 系统检查脚本/系统优化脚本/系统安全加固脚本
- 其他功能脚本
- 备份脚本
- …..
二.判断
- 条件测试语句 test == [] 文件类型,比较大小,字符串对比,逻辑判断(与或非)
- if
- case语句
2.1 []
- 很少单独使用,基本上与if一起使用
- 隐藏用法与&&,|| 搭配使用,实现初级简单判断
&& and符号 并且 前一个命令执行成功了,然后执行后面的命令,简单的判断
|| 或 前一个命令执行失败了,然后执行后面的命令
|| 或 前一个命令执行失败了,然后执行后面的命令
2.1.1 文件类型判断
| 文件类型判断 | 说明 | 应用场景 |
| -f | file 检查文件是否存在 | |
| -d | directory 检查目录是否存在 | 操作目录之前检查目录是否存在 |
| -h/-L | 是否存在,是否为软连接 | |
| -x | x权限,检查是否存在并是否有x权限 | 检查命令是否存在,未来使用which即可 |
| -s | 文件内容是否存在文件内容是否大于0 |
[ -f /etc/hosts ] && echo 成功 || echo 失败
[ -d /etc/ ] && echo 成功 || echo 失败
[ -x /bin/ls ] && echo 成功 || echo 失败
[ -L /etc/rc.local ] && echo 成功 || echo 失败
[ -d /etc/ ] && echo 成功 || echo 失败
[ -x /bin/ls ] && echo 成功 || echo 失败
[ -L /etc/rc.local ] && echo 成功 || echo 失败
2.1.2 比大小
温馨提示:比大小只能比较整数,无法比较小数(浮点数)
| 比较大小 | 说明 | 对应的符号 |
|---|---|---|
| -eq | 等于 | == |
| -ne | 不等于 | != |
| -gt | 大于 | > |
| -ge | 大于等于 | >= |
| -lt | 小于 | < |
| -le | 小于等于 | <= |
2.1.3 字符串
| 字符串对比 | 说明 | 应用场景 |
|---|---|---|
| “串1” = “串2” | 字符串等于 | 不方便使用数字,可以使用字符串 |
| “串1” = “串2” | 字符串不等于 | 不方便使用数字,可以使用字符串 |
| -z “变量” | 变量/字符为空,则成功 | 检查变量是否为空 |
| -n “变量” | 变量/字符不为空,则成功 | 检查变量是否为空 |
#1.vars
name=”$*”
echo “请睁开眼睛看 服务是否启动与开机自启动,后续改为if判断”
systemctl is-active $name
systemctl is-enabled $name
#2.check var
if [ $# -eq 0 ];then
echo “Usage: bash $0 server name”
exit 1
fi
#3.user
user=”$*”
echo “该用户的情况”
id $user
name=”$*”
echo “请睁开眼睛看 服务是否启动与开机自启动,后续改为if判断”
systemctl is-active $name
systemctl is-enabled $name
#2.check var
if [ $# -eq 0 ];then
echo “Usage: bash $0 server name”
exit 1
fi
#3.user
user=”$*”
echo “该用户的情况”
id $user
2.1.4 逻辑运算
- 与或非
| 逻辑运算 | 说明 |
|---|---|
| 与(并且)and | -a 多个条件同时成立 |
| 或(或者)or | -o 多个条件有一个成立就行 |
| 非(取反) | !取反 |
2.1.5正则
- 做判断
- $# 参数个数
- -z 变量是否为空
- 使用正则匹配
- [ ] vs [[ ]]
- 区别:[]支持不正则,[[ ]] 支持正则
2.2 if
| if判断 | 说明 | 应用场景 |
|---|---|---|
| if单分支 | 脚本开头做检查 | 检查变量,参数个数,命令,数字 |
| if二分支 | 2种情况 | 状态检查,服务检查,端口 |
| if多分支 | 3种情况,多条件多种情况使用 | 多级别检查 |
2.3 case语句
- 类似于if多分支判断
- case用于实现菜单选择功能,而不是真的做范围的对比
- 列出选择,用户进行选择即可
- 应用场景:
- 多功能的安装脚本
- 判断系统(红帽系统,ubt/debainxt)
- 服务管理脚本
- case格式
case “变量” in
1) echo 内容 ;;
2) echo 内容 ;;
*)echo 输入错误重新输入 ;;
esac
#注意*表示所有 用于兜底
1) echo 内容 ;;
2) echo 内容 ;;
*)echo 输入错误重新输入 ;;
esac
#注意*表示所有 用于兜底
- read
cat<<EOF
内容
EOF
read -p “请输入您的选择”num
case “变量” in
1) echo 内容 ;;
2) echo 内容 ;;
*)echo 输入错误重新输入 ;;
esac
内容
EOF
read -p “请输入您的选择”num
case “变量” in
1) echo 内容 ;;
2) echo 内容 ;;
*)echo 输入错误重新输入 ;;
esac
- source bash/sh 运行脚本
- bash /sh 运行脚本即可
- 通过source 加载其他文件内容(变量文件);比如:/etc/os-release文件内容
三. 循环
- for循环
- while循环
3.1 for循环
for 变量名字 in 变量值清单(列表)
do
执行的命令
done
do
执行的命令
done
1.获取所有磁盘分区 挂载/分区名 /etc/fstab 排除swap 空行 注释行
2.丢到循环中
1)df -h 挂载点 创建变量
2)分区名
3)大小
4)使用率
5)输出
2.丢到循环中
1)df -h 挂载点 创建变量
2)分区名
3)大小
4)使用率
5)输出

3.2 while
3.2.1介绍与格式
- 应用场景:
- 死循环
- 读取文件内容
满足条件才会进行循环
while 条件命令
do
需要执行的命令
done
while 条件命令
do
需要执行的命令
done
3.2.2 死循环
需要书写巡检脚本,精确到秒进行检查
3.2.3 编写脚本为死循环形式实现每5秒检查

3.2.4 while读取文件
#方案01 推荐使用
line 变量名字
while read line
do
内容命令
done < 文件名
#方案02 使用管道的时候
line 变量名字
cat 文件名 | while read line
do
内容命令
done
#方案03 几乎不用
exec< 文件名
while read line
do
内容命令
done
line 变量名字
while read line
do
内容命令
done < 文件名
#方案02 使用管道的时候
line 变量名字
cat 文件名 | while read line
do
内容命令
done
#方案03 几乎不用
exec< 文件名
while read line
do
内容命令
done
3.3循环控制语句
| 循环控制语句 | 说明 |
|---|---|
| break | 打断,结束循环 |
| continue | 跳过,结束当前循环进行下次循环 |
| exit | 结束脚本 |
| return | 函数结尾,给函数设置返回值 |
3.3.1 书写一个猜数字的脚本
1.生成一个1-100的随机数字1
2.死循环
1)输入一个数字
2)检查是否为数字,负责重新输入(跳过当前循环进行下次)
3)输入数字后 对比 大于,小于,等于 并进行输出
a)等于则输出等于并结束循环
b)大于输出大于,减小一点
c)小于输出小于,增大一点
3.猜数字结束,数字是xxx
随机数字
num=$((RANDOM%100+1))
2.死循环
1)输入一个数字
2)检查是否为数字,负责重新输入(跳过当前循环进行下次)
3)输入数字后 对比 大于,小于,等于 并进行输出
a)等于则输出等于并结束循环
b)大于输出大于,减小一点
c)小于输出小于,增大一点
3.猜数字结束,数字是xxx
随机数字
num=$((RANDOM%100+1))

四、计算操作
| 计算方案 | 说 | 应用 |
|---|---|---|
| let | 整数 | 常用 let i=i+1 == let i ++ |
| $(()) | 整数 | RANDOM%100 取余 |
| $[] | 整数 | |
| expr | 整数 | 用于检查输入是否为数字,现在我们使用正则检查即可 |
| awk | 小数 | |
| bc | 小数 |
4.1 bc使用与控制小数位数
echo “scale=2;10/3” | bc -l
输出:3.33
scale=2;小数点后2位
输出:3.33
scale=2;小数点后2位
4.2 awk计算

五、函数
- 脚本更加专业.模块化
- 创建自己的函数库
- 本质:类似于我们自定义的1个2命令
- 注意事项:函数名字不用与名字相同
创建函数
方法01:
function 函数名字(){
函数内容/命令
}
方法02:
函数名字(){
函数内容/命令
return $?
}
方法03:
funtion 函数名字 {
函数内容/命令
return $?
}
方法01:
function 函数名字(){
函数内容/命令
}
方法02:
函数名字(){
函数内容/命令
return $?
}
方法03:
funtion 函数名字 {
函数内容/命令
return $?
}