在Windows中进行不可描述的动作时,经常看到这种界面。
在Linux中使用Shell脚本也能快速实现这样的功能,以Nginx的四个命令为例,封装成快速执行的工具包。
| Nginx命令 | |
|---|---|
| nginx -s reload | 重启 |
| /usr/sbin/nginx | 启动 |
| nginx -s stop | 停止 |
| nginx -t | 检查配置文件 |
少罗嗦,先看东西
将Nginx的重启、停止、启动、检查配置文件命令组合成一个脚本文件,只要输入前面的序号,就可以完成对应操作。
shell脚本是什么?
在Linux中系统中,常常使用cd、ls等命令,这就是shell命令
🌰 举个例子:进入root目录
cd root
多个shell命令组合到一起就是shell脚本,以.sh结尾,能像程序一样运行。
🌰 举个例子:下面的命令保存为1.sh ,放到/home目录,下次输入/home/1.sh就可以重启nginx啦
#!/bin/bash
nginx -s reload
怎么运行?
shell脚本运行非常简单,只要输入.sh文件的所路径即可
/home/1.sh
但是!
首次运行时,需要给执行权限
赋执行权限也非常简单,一行命令(注意路径)
🌰 举个例子:给/home/1.sh添加执行权限
chmod +x /home/1.sh
shell编程常用命令
和其他编程语言一样,shell也有判断、变量、循环语句,我们先来了解一些本次学习用到的
不罗嗦了,自学请看这里👉 菜鸟教程 | shell教程
shell脚本开头
所有shell文件必须以#!/bin/bash 这样做的目的是告诉系统,"这是shell脚本,不是文本文件"
#!/bin/bash
输出文字
echo "文字" 是输出文字,用于给用户展示消息
注意:要加引号,而且必须是英文引号
🌰 举个例子:
#!/bin/bash
echo "============================="
echo "Nginx管理 - 选择操作"
echo "============================="
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
变量
shell中定义变量非常简单,只要变量名=值就可以了,调用变量时使用$变量名。
我们把两个=============================使用变量替换一下,输出结果完全一致
🌰 举个例子:
#!/bin/bash
HR="============================="
echo $HR
echo "Nginx管理 - 选择操作"
echo $HR
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
获取用户输入
获取用户输入是脚本核心,使用 read -ep "文字" ACTION命令,ACTION是一个变量,用于保存用户输入的值,可以用其他变量名
- -p 表示有提示文字(往下看图)
- -e 在输入的时候可以使用linux命令补全功能。
🌰 举个例子:
#!/bin/bash
HR="============================="
echo $HR
echo "Nginx管理 - 选择操作"
echo $HR
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
read -ep "输入操作序号:" ACTION
注释
shell使用#作为行注释,只要在行首添加#就表示本行是注释,不被执行
🌰 举个例子:
#!/bin/bash
#我就是注释行
分支语句
用户输入完序号,需要根据不同序号执行不同命令,这时候就用到了分支 case esac,先来了解一下他的用法
case $ACTION in
'')
# 输入空时,执行这里的代码
;;
0)
# 输入0时,执行这里的代码
;;
*)
# 除上面的值以外的值(必须放在最后)
;;
esac
🌰 举个例子:把分支加到之前的脚本中
#!/bin/bash
HR="============================="
echo $HR
echo "Nginx管理 - 选择操作"
echo $HR
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
read -ep "输入操作序号:" ACTION
case $ACTION in
0)
# 退出
;;
'')
# 退出
;;
1)
#重启方法
;;
2)
#启动方法
;;
3)
#停止方法
;;
4)
#配置方法
;;
esac
退出
exit 是退出命令,当用户输入"0"和空时,退出脚本
🌰 举个例子:
exit 放在 0) 的下一行
#!/bin/bash
HR="============================="
echo $HR
echo "Nginx管理 - 选择操作"
echo $HR
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
read -ep "输入操作序号:" ACTION
case $ACTION in
0)
exit
;;
'')
exit
;;
1)
#重启方法
;;
2)
#启动方法
;;
3)
#停止方法
;;
4)
#配置方法
;;
esac
方法
方法(😎没错就是js的function)是一组命令的集合,内容多了以后,改成方法更容易维护。
分别把重启、启动、停止、检查配置定义方法
- 重启:nginxRestart
- 启动:nginxStart
- 停止:nginxStop
- 检查配置文件:nginxConfig
🌰 举个例子:
nginxRestart(){
# 重启的相关代码 放在这里
}
nginxStart(){
# 启动的相关代码 放在这里
}
调用方法
shell的方法调用十分简单,只要使用方法名即可
🌰 举个例子:调用nginx重启
nginxRestart
顺便把所有代码定义成 main函数,并且立即调用一下
后面【返回主菜单】功能会用到
#!/bin/bash
# 变量
HR="============================="
#主函数
main(){
echo $HR
echo "Nginx管理 - 选择操作"
echo $HR
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
read -ep "输入操作序号:" ACTION
case $ACTION in
0)
exit
;;
'')
exit
;;
1)
nginxRestart
;;
2)
nginxStart
;;
3)
nginxStop
;;
4)
nginxConfig
;;
esac
nginxRestart(){
# 重启的相关 放在这里
}
nginxStart(){
# 启动的相关 放在这里
}
nginxStop(){
# 停止的相关 放在这里
}
nginxConfig(){
# 配置的相关 放在这里
}
}
#调用主函数
main
现在我们的框架代码就完成了
你可以添加更多数字,定义更多方法,变成你的专用脚本。
组装功能
主要框架完成后,我们来分别实现各个功能
开始前再学习一个命令 清屏,清空屏幕上的所有信息
printf "\033c"
重启
nginx的重启命令:nginx -s load ,执行完以后提供返回主菜单和退出的选项
🌰 举个例子:思路与主框架一致,显示文字等待用户输入
nginxRestart() {
printf "\033c" #清屏
echo $HR
echo "Nginx管理 - 1.重启"
echo $HR
#------------------------
nginx -s load
echo "*** 执行完毕 ***"
#------------------------
echo ""
echo "#) 任意键返回主菜单"
echo "0) 退出"
read -ep "输入操作序号:" ACTION
case $ACTION in
'')
main #返回主函数
;;
0)
exit
;;
*)
main #返回主函数
;;
esac
}
启动
nginx的启动命令:/usr/sbin/nginx ,只需要改动一行命令就可以。
🌰 举个例子:
nginxStart(){
# ……省略
#------------------------
/usr/sbin/nginx
echo "*** 执行完毕 ***"
#------------------------
# ……省略
}
停止
nginx的启动命令:nginx -s stop ,同样修改中间的部分
🌰 举个例子:
nginxStop(){
# ……省略
#------------------------
nginx -s stop
echo "*** 执行完毕 ***"
#------------------------
# ……省略
}
配置
nginx的检查配置文件命令:nginx -t ,同样修改中间的部分
🌰 举个例子:
nginxConfig(){
# ……省略
#------------------------
nginx -t
echo "*** 执行完毕 ***"
#------------------------
# ……省略
}
💥完整代码
#!/bin/bash
#变量
#=========================================
#nginx命令
Nginx_restart="nginx -s reload"
Nginx_start="/usr/sbin/nginx"
Nginx_stop="nginx -s stop"
#提示文本
HR="============================="
FINISH="*** 执行完毕 ***"
#=========================================
#主函数
main() {
printf "\033c" #清屏
echo $HR
echo "Nginx管理 - 选择操作"
echo $HR
echo " 1) 重启"
echo " 2) 启动"
echo " 3) 停止"
echo " 4) 检查配置文件"
read -ep "输入操作序号:" ACTION
case $ACTION in
0)
exit
;;
'')
exit
;;
1)
nginxRestart
;;
2)
nginxStart
;;
3)
nginxStop
;;
4)
nginxConfig
;;
esac
}
#重启
nginxRestart() {
printf "\033c" #清屏
echo $HR
echo "Nginx管理 - 1.重启"
echo $HR
#------------------------
$Nginx_restart
echo $FINISH
#------------------------
echo ""
echo "#) 任意键返回主菜单"
echo "0) 退出"
read -ep "输入操作序号:" ACTION
case $ACTION in
'')
main
;;
0)
exit
;;
*)
main
;;
esac
}
#启动
nginxStart() {
printf "\033c" #清屏
echo $HR
echo "Nginx管理 - 2.启动"
echo $HR
#------------------------
$Nginx_start
echo $FINISH
#------------------------
echo ""
echo "#) 任意键返回主菜单"
echo "0) 退出"
read -ep "输入操作序号:" ACTION
case $ACTION in
'')
main
;;
0)
exit
;;
*)
main
;;
esac
}
#停止
nginxStop() {
printf "\033c" #清屏
echo $HR
echo "Nginx管理 - 3.停止"
echo $HR
#------------------------
$Nginx_stop
echo $FINISH
#------------------------
echo ""
echo "#) 任意键返回主菜单"
echo "0) 退出"
read -ep "输入操作序号:" ACTION
case $ACTION in
'')
main
;;
0)
exit
;;
*)
main
;;
esac
}
#版本
nginxConfig() {
printf "\033c" #清屏
echo $HR
echo "Nginx管理 - 4.检查配置文件"
echo $HR
#------------------------
nginx -t
echo $FINISH
#------------------------
echo ""
echo "#) 任意键返回主菜单"
echo "0) 退出"
read -ep "输入操作序号:" ACTION
case $ACTION in
'')
main
;;
0)
exit
;;
*)
main
;;
esac
}
#调用主函数
main
优化代码
本案例可以将4个功能优化成一个,利用不同参数实现功能,以及增加对命令返回值的处理。
但是!
冗余的代码容易修改,Copy一下改改就是你的命令包,优化的事,下次再说!
运行一下
-
保存shell脚本到/home目录,文件名:nginx.sh
上传不用我教吧 (>ω・* )ノ
-
赋执行权限
chmod +x /home/nginx.sh -
运行
/home/nginx.sh
什么!你的报错?
把行尾符改成LF 一般编辑器会默认CRLF
-
CRLF表示句尾使用回车换行两个字符(即我们常在Windows编程时使用"\r\n"换行)
-
LF表示表示句尾,只使用换行.
-
CR表示只使用回车.
CRLF:windows系统
LF:Linux系统
CR:mac系统
VScode编辑器点一下右下角的CRLF,切换一下就好了
如果你的编辑器不是Vscode,那我建议