通过封装Nginx4个命令,学习编写Shell脚本

424 阅读5分钟

在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 ,执行完以后提供返回主菜单和退出的选项

image.png

🌰 举个例子:思路与主框架一致,显示文字等待用户输入

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一下改改就是你的命令包,优化的事,下次再说!

运行一下

  1. 保存shell脚本到/home目录,文件名:nginx.sh

    上传不用我教吧 (>ω・* )ノ

  2. 赋执行权限

    chmod +x /home/nginx.sh
    
  3. 运行

    /home/nginx.sh
    

什么!你的报错?

把行尾符改成LF 一般编辑器会默认CRLF

  • CRLF表示句尾使用回车换行两个字符(即我们常在Windows编程时使用"\r\n"换行)

  • LF表示表示句尾,只使用换行.

  • CR表示只使用回车.

CRLF:windows系统

LF:Linux系统

CR:mac系统

VScode编辑器点一下右下角的CRLF,切换一下就好了

如果你的编辑器不是Vscode,那我建议