你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

shell脚本写到停不下来

[复制链接]
gaosmile 发布时间:2020-6-23 10:18
平常工作中,你是否感觉shell脚本只是命令的堆砌;很多时候只是为了实现功能而没有好的组织结构;自己的脚本都不想再看一遍;哈哈,我这就教给shell的“葵花宝典“,自此让你的shell脚本有python一样的美感并且极易维护,真的是shell脚本写到停不下来。
现以nginx控制脚本为例,看一下脚本的美容过程:

  1. #!/bin/bash
  2. # set命令的奇妙用途留在文章末尾
  3. set -eu
  4. # nginx重载配置文件
  5. nginx -c /etc/nginx/nginx.conf -t
  6. kill -HUP `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
复制代码

宝典秘籍之变量抽离
在脚本中,需要依赖外部的配置,比如配置文件位置,监听端口之类的可变参数,编程时,需要将其抽离为变量,为了更好的引用与维护,省去了外部配置变化时,一个个修改带来的麻烦。
  1. <font style="background-color:rgb(255, 255, 255)">
  2. #!/bin/bash
  3. # set命令的奇妙用途留在文章末尾
  4. set -eu
  5. # nginx配置文件在不同环境中,位置可能不同,所以需要将其抽离成可配置变量,脚本来引用
  6. NGINX_CONFIG_FILE=/etc/nginx/nginx.conf

  7. # nginx重载配置文件
  8. nginx -c $NGINX_CONFIG_FILE -t
  9. kill -HUP `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`</font><font style="background-color:rgb(255, 255, 255)">
  10. </font>
复制代码
宝典秘籍之模块化
运维毕竟不是专业程序员,写脚本时是怎么舒服怎么来,简单讲就是从上到下依次执行,这就导致复用性差,不易维护,解决这问题的关键在于函数化、模块化思想,shell虽然是一种比较简单的语言,但语言基本的逻辑控制、函数功能都有,这就让我们编写高质量shell脚本带了无限可能。接下来就看一下具体例子来感受一下:

  1. # 由于nginx配置文件检查是执行其他操作的第一步,所以我们将其独立成一个单独函数
  2. #!/bin/bash
  3. # set命令的奇妙用途留在文章末尾
  4. set -eu
  5. # nginx配置文件在不同环境中,位置可能不同,所以需要将其抽离成可配置变量,脚本来引用
  6. NGINX_CONFIG_FILE=/etc/nginx/nginx.conf

  7. # 抽离配置文件检查为单独的函数
  8. config_test() {
  9.     nginx -c $NGINX_CONFIG_FILE -t
  10. }
  11. get_nginx_master_pid(){
  12.     echo `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
  13. }
  14. # 抽离配置重载为独立函数
  15. reload() {
  16.     kill -HUP `get_nginx_master_pid`
  17. }

  18. # nginx重载配置文件
  19. config_test
  20. reload
复制代码

宝典秘籍之main函数
脚本的可维护性在于脚本的结构的好坏,为了拥有更好的结构,通常需要在脚本中定义入口函数,即main函数,让我在维护脚本时,可以更好的把握脚本的组织架构,找到切入点:
  1. <font style="background-color:rgb(255, 255, 255)">
  2. # 由于nginx配置文件检查是执行其他操作的第一步,所以我们将其独立成一个单独函数
  3. #!/bin/bash
  4. # set命令的奇妙用途留在文章末尾
  5. set -eu
  6. # nginx配置文件在不同环境中,位置可能不同,所以需要将其抽离成可配置变量,脚本来引用
  7. NGINX_CONFIG_FILE=/etc/nginx/nginx.conf

  8. # 抽离配置文件为单独的函数
  9. config_test() {
  10.     nginx -c $NGINX_CONFIG_FILE -t
  11. }

  12. get_nginx_master_pid(){
  13.     echo `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
  14. }
  15. # 抽离配置重载为独立函数
  16. reload() {
  17.     kill -HUP `get_nginx_master_pid`
  18. }

  19. # 入口函数
  20. main() {
  21.     config_test
  22.     reload
  23. }

  24. # main在此需要获取脚本本身的参数, 故将$@传递给main函数
  25. main $@</font><font style="background-color:rgb(255, 255, 255)">
  26. </font>
复制代码
宝典秘籍之函数返回值
在其他编程语言,可以通过return获得函数的返回值,但是return语句在shell中含义不同,return命令会使一个函数返回,会返回一个单一的数字参数,而这个数字参数在调用这个函数的脚本是可见的,如果没有指定返回参数,return在默认情况下会返回上一次命令的返回代码。那如何实现类似其他编程语言的return效果呢?可以使用echo命令:
  1. <font style="background-color:rgb(255, 255, 255)">
  2. #!/bin/bash
  3. set -eu
  4. NGINX_CONFIG_FILE=/etc/nginx/nginx.conf

  5. config_test() {
  6.     nginx -c $NGINX_CONFIG_FILE -t
  7. }

  8. # 在此处直接把nginx的master pid可以通过反引号来获取echo后的值
  9. get_nginx_master_pid(){
  10.     echo `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
  11. }

  12. reload() {
  13.     # `get_nginx_master_pid` 获得nginx master pid
  14.     kill -HUP `get_nginx_master_pid`
  15. }

  16. # 入口函数
  17. main() {
  18.     config_test
  19.     reload
  20. }

  21. # main在此需要获取脚本本身的参数, 故将$@传递给main函数
  22. main $@</font><font style="background-color:rgb(255, 255, 255)">
  23. </font>
复制代码
宝典秘籍之set命令
bash内置的set命令,可以改变我们脚本的执行行为,让我对脚本的把握和调试更有力,下面说几种常用的set指令,相信你都会喜欢的:
•set -e: bash脚本遇到错误立即退出•set -n: 检查脚本语法但不执行•set -u: 遇到未设置的变量立即退出•set -o pipefail: 控制在管道符执行过程中有错误立即退出•set -x: 分步调试命令
在写脚本时,我们可以直接在脚本开头简写为如下格式:
  1. <font style="background-color:rgb(255, 255, 255)">
  2. #!/bin/bash
  3. set -euxo pipefail</font><font style="background-color:rgb(255, 255, 255)">
  4. </font>
复制代码
检查bash脚本的语法时,可以这样写:

  • bash -n main.sh
收藏 评论1 发布时间:2020-6-23 10:18

举报

1个回答
desk1983 回答时间:2020-6-23 15:29:54
沙发
非常好的资料,感谢分享非常好的资料,感谢分享非常好的资料,感谢分享非常好的资料,感谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版