在日常工作中,是不是觉得shell脚本只是一堆命令;很多时候只是为了实现功能,没有良好的组织架构;我不想再读我自己的剧本;哈哈,我教了shell《向日葵宝典》,从此你的shell脚本就拥有了python一样的美,而且极易维护。停止编写shell脚本真的是不可能的。现在以nginx控制脚本为例,看看脚本的美丽过程:#!/bin/bash#set命令的精彩用法留到文末set-eu#nginx重载配置文件nginx-c/etc/nginx/nginx.conf-tkill-HUP`psauxf|grep-E"nginx:[[:space:]]+master"|awk'{print$2}'`本书和秘籍的变量在脚本中提取出来,需要依赖外部配置。例如配置文件的位置、监听端口等变量参数,在编程时需要分离成变量。为了更好的参考和维护,省去了一项一项修改外部配置的麻烦。#!/bin/bash#set命令的妙用留到文末set-eu#nginx的配置文件在不同的环境下可能有不同的位置,所以需要抽取成一个可配置的变量,并且脚本引用NGINX_CONFIG_FILE=/etc/nginx/nginx.conf#nginx重载配置文件nginx-c$NGINX_CONFIG_FILE-tkill-HUP`psauxf|grep-E"nginx:[[:space:]]+master"|awk'{print$2}'秘籍书的模块化运维毕竟不是专业的程序员。写剧本的时候有多舒服。简单来说就是从上到下顺序执行,导致复用性差,维护困难。解决这个问题的关键在于函数化,模块化的思维,shell虽然是一种比较简单的语言,但是该语言具有基本的逻辑控制和函数式功能,这让我们可以编写出具有无限可能的高质量的shell脚本。接下来我们来看一个具体的例子来感受一下:#由于检查nginx配置文件是执行其他操作的第一步,所以我们将其单独放到一个单独的函数中#!/bin/bash#的妙用set命令留在文末set-eu#nginx的配置文件在不同的环境下可能有不同的位置,所以需要解压成一个可配置的变量,脚本会参考NGINX_CONFIG_FILE=/etc/nginx/nginx.conf#提取配置文件并将其作为单独的文件进行检查Functionconfig_test(){nginx-c$NGINX_CONFIG_FILE-t}get_nginx_master_pid(){echo`psauxf|grep-E"nginx:[[:space:]]+master"|awk'{print$2}'`}#drawOverloadingfromtheconfigurationisanindependentfunctionreload(){kill-HUP`get_nginx_master_pid`}#nginx重载配置文件config_testreload主函数脚本的可维护性秘籍在于脚本的结构。为了有一个更好的结构,通常需要在脚本中定义入口函数,也就是main函数,这样我在维护脚本的时候就可以更好的掌握脚本的组织结构,找到入口点:#由于nginx的配置文件检查是执行其他操作的第一步,所以我们将其分离成一个单独的函数#!/bin/bash#set命令的精彩用法留到文末set-eu#nginx配置文件的位置可能在不同的环境不同,所以需要提取到一个可配置的变量中,脚本引用NGINX_CONFIG_FILE=/etc/nginx/nginx.conf#将配置文件提取到一个单独的函数config_test(){nginx-c$NGINX_CONFIG_FILE-t}get_nginx_master_pid(){echo`psauxf|grep-E"nginx:[[:space:]]+master"|awk'{print$2}'`}#提取配置并将其作为独立函数重载reload(){kill-HUP`get_nginx_master_pid`}#入口函数main(){config_testreload}#main需要在这里获取脚书本本身的参数,所以$@传递给主函数main$@秘籍书的函数返回值在其他编程语言中,可以通过return获取函数的返回值,但是return语句有在shell中是一个不同的意思,return命令会让一个函数返回时,它会返回一个单一的数值参数,而这个数值参数在调用这个函数的脚本中是可见的。如果没有指定return参数,return默认返回上一条命令的返回码。如何实现类似于其他编程语言的返回效果呢?可以使用echo命令:#!/bin/bashset-euNGINX_CONFIG_FILE=/etc/nginx/nginx.confconfig_test(){nginx-c$NGINX_CONFIG_FILE-t}#这里可以直接通过反引号获取nginx的masterpid来获取echoget_nginx_master_pid()后的值{echo`psauxf|grep-E"nginx:[[:space:]]+master"|awk'{print$2}'`}reload(){#`get_nginx_master_pid`获取nginxmasterpidkill-HUP`get_nginx_master_pid`}#入口函数main(){config_testreload}#这里的main需要获取脚本本身的参数,所以$@传给秘籍书bash内置set命令的main函数main$@set命令,它可以改变我们脚本的执行行为,让我更强大的掌握和调试脚本。下面是一些常用的set命令,相信你会喜欢:?set-e:bash脚本遇到错误立即退出?set-n:检查脚本语法但不执行?set-u:遇到unset立即退出变量?set-opipefail:controlpipe执行过程中出现错误立即退出,我们可以直接在脚本开头简写如下格式:#!/bin/bashset-euxopipefail检查语法时bash脚本,可以这样写:bash-nmain.sh以上是良序教程网为各位小伙伴分享的shell高效编程。以上就是良序教程网为各位小伙伴们分享的Linux相关知识。
