首页 > 系统相关 >shell脚本书写规范规则总结!!

shell脚本书写规范规则总结!!

时间:2023-04-11 16:13:22浏览次数:48  
标签:脚本 文件 shell 运维 书写 使用 执行

七年老运维实战中的 Shell 开发经验总结

名名名名名名名名 运维网工 2023-04-10 11:50 发表于香港 收录于合集 #网络运维71个 #运维管理58个 #运维工程师109个

图片

转载:https://blog.csdn.net/cpongo2ppp1/article/details/90172429

无论是系统运维,还是应用运维,均可分为“纯手工”—> “脚本化”—> “自动化”—>“智能化”几个阶段,其中自动化阶段,主要是将一些重复性人工操作和运维经验封装为程序或脚本,一方面避免重复性操作及风险,另一方面提高执行效率。在自动化运维的转变过程中,经常使用的可能就是shell脚本了,今天主要分享下shell脚本开发在运维工作中的一些经验总结。
小脚本有大智慧,别小看几十行代码,夹杂着系统设计、代码规范和操作经验等等细节,在建设自动化运维的工作中,还是很值得我们研究学习的,下面总结这些也都是源于各位脚本达人和我们在自身工作中“遇到的坑”、“摔过的跟头”和“排过的雷”,与大家共享。图片这里主要介绍并参考我行已经形成的一些shell编写规范,编写时严格遵守这些规范,不仅使编写人受益,同时也能提高使用者的执行效率。1)脚本开头部分应有脚本功能说明、参数使用说明、作者姓名、创建/修改日期、版本信息,格式为:图片2)脚本编写时,注意格式对齐,如所有的循环或者判断语句前后的语句进行对齐,以及case的选取完全,如:图片3)脚本开头执行时,执行如下命令,在执行过程中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出:图片4)建议将命令行的每个参数放在单引号、双引号中,特别是rm、mv等可能对生产现有数据造成修改的操作,建议使用垃圾箱策略:rm操作转意为mv操作,制定文件保存目录,以防回退,并定期清理:图片5)命令行中参数需要使用‘*’、‘?’通配符的,应依据最精确匹配原则,如能确定文件、目录名称的前缀、后缀、扩展名及其他可识别关键字的,须在参数中包含该信息,如能确定文件、目录的长度应使用‘?’通配符,不得使用‘*’,推荐的使用方式:图片不推荐使用的方式:图片禁止使用的方式:图片6)给数值型变量的赋值后,需由手段保证变量的值为数值型,避免在后续的处理中出现异常:图片7)在判断条件中使用的变量,必须包含在双引号中,如:图片禁止使用的方式:
图片图片8)对文件进行打包备份时,必须使用相对路径进行打包,如:图片严禁将全路径打入tar包, 如:图片9)对于打包后还需进行压缩的文件,建议使用管道进行处理,如:图片不建议两部分分开执行:图片10)使用ps命令筛选进程时,如能确定进程所属用户,必须在参数中指定用户名称,如其输出作为kill命令的输入,则必须指定进程所属用户,如:图片
图片这里介绍的主要是日常shell编写中遇到比较隐蔽或看似简单,却难以发现的“坑”,编写中应尽量避免使用,使用更优的方法避免重蹈覆辙。1)更新文件使用>不用cp使用>修改和回退文件时,保留原文件的属组和权限,避免使用cp时权限属组被修改。图片2)使用kill前确认关键字用-w 精确匹配字段;kill前后都保留现场, 两次ps -ef|grep -w 关键字|grep -v grep >>/tmp/kill_进程名_.backup;删除前要校验,获取进程号是否唯一,避免多杀或误杀的情况。图片3)使用rm前确认删除前备份删除对象信息,避免使用变量,直接使用文件和目录名;如果必须使用时,删除前,建议检查避免误删,删除目录和文件信息保留:图片建议禁用find遍历根目录进行查找,同时删除前进行确认,避免多删或误删的情况。4)For循环的坑for循环的in条件按空格来区分,避免进入不正确或死循环。图片5)while循环的禁忌如果还想使用循环中的变量,不要while结合管道使用。图片6)慎用cp这句话基本上正确,但同样有空格分词的问题。所以应当用双引号:图片但是如果凑巧文件名以 - 开头,这个文件名会被 cp 当作命令行选项来处理。可以试试下面这个:   图片但也可能再碰上一个不支持 -- 选项的系统,所以最好用下面的方法: 图片7)慎用cd避免使用cd到操作目录再操作的方式,可能导致进入目录失败,误删除,如:图片建议如下:图片8)     用[[  ]]代替[ ]图片当$var为空时,上面的命令就变成了[ ="bar" ]类似地,当$var包含空格时:[ space words here = "var" ]两者都会出错。所以应当用双引号将变量括起来:[ "$var" = var ]  几乎完美了。但是,当$var以 - 开头时依然会有问题。在较新的bash中你可以用下面的方法来代替,[[ ]]关键字能正确处理空白、空格、带横线等问题。图片另注意,[[适用于字符串,如果是数值,要用如:(( $var > 8 ))
9)管道操作中不要同时读写文件图片你不能在同一条管道操作中同时读写一个文件。根据管道的实现方式,file要么被截断成0字节,要么会无限增长直到填满整个硬盘。如果想改变原文件的内容,只能先将输出写到临时文件中再用mv命令。图片10)cd的易错问题cd 有可能会出错,导致要执行的命令就会在你预想不到的目录里执行了。所以一定要记得判断cd的返回值。
图片如果你要根据cd的返回值执行多条命令,可以用 ||。图片关于目录的一点题外话,假设你要在shell程序中频繁变换工作目录,如下面的代码:图片不如这样写:图片括号会强制启动一个子shell,这样在这个子shell中改变工作目录不会影响父shell(执行这个脚本的shell),就可以省掉cd - 的麻烦。
图片目前行里自动化工具越来越多,无论是应用的MAOP或系统的SMDB,自动化实现都还是日常运维脚本的调用,结合日常运维的一些经验,脚本中就更需要考虑周全和控制风险。这里介绍一些结合运维场景的脚本应用,希望规避以前犯过的错,重点在控制风险。1)     支持交互式脚本的应用很多脚本中需要进行交互,在规避风险的同时,需要通过自动化工具发布来支持交互,可以使用expect,示例如下:图片也可以使用curl工具来替代简单的交互:#FTP SFTP下载curl-u ftpuser:ftppassword -O "sftp://ftp_ip:ftp_port/pathfile" #FTP SFTP上传curl-u ftpuser:ftppassword  --ftp-create-dirs-T upfile "sftp://ftp_ip:ftp_port/filepath/upfile"2)脚本规范执行和日志追溯直接执行的脚本很危险,要提示用户如何使用脚本,并记录日志以便跟踪。示例如下:图片3)脚本的并发锁控制避免多人同时执行或并发同时执行的异常问题,建议增加锁机制,示例如下:图片4)控制脚本不退出的风险周期频繁执行的脚本,需要防止脚本hang住不退出,导致后续脚本再次执行。图片5)避免集中发布脚本造成的风险使用ftp、sftp传输、下载文件,或者集中访问存储端口时,尽量增加发布对象散列,避免集中操作造成存储端口拥堵,跨防火墙流量超限报警等影响。图片6)避免文件无限增长的风险向一个文件中追加数据时,一定要设置阀值,必要时清空,避免文件无限增大:图片目录增加清理过期文件策略,避免产生的文件越来越多,造成文件节点用尽:图片目录中的文件过多,会报参数太长错误无法删除,建议放在循环中遍历删除:图片
总结:
鉴于以上脚本,我们可以从中汲取一些经验,规避一些风险:通过增加日志记录输出和脚本执行的方法说明,并自动交互和传递参数,避免执行脚本的操作风险;利用文件锁机制和运维中一些规避风险的方法,使得脚本自动执行起来更便捷更安全。1. 通过规范类脚本的定义,标准常量定义、清晰的注释、函数和变量大小写用法,细节中可以看出严谨,即使只有几行,也能体现出一名优秀脚本开发人员的素质。2. 通过易错类脚本中的“坑”,使得 shell面向过程的编写更得心应手,让脚本规范的同时,逻辑也更严谨清晰,避免了错误,也提高了脚本的开发效率。3. 通过运维场景的脚本应用,规避各种开发和执行过程中的风险,使得shell脚本不仅能支持自动化发布,更可以全面智能化的为运维服务。

END

运维网工 分享网络运维、运维规划、运维开发、Python运维、Linux运维、devops工具链、k8s容器化技术、自动化监控、日志收集等知识,推广围绕DevOps理念的自动化运维、高效运维、智能运维等优秀实践,让运维工程师更加专注于自动化。 9篇原创内容 公众号 收录于合集 #网络运维  71个 上一篇一个悄然成为世界最流行的操作系统 阅读 742    

标签:脚本,文件,shell,运维,书写,使用,执行
From: https://www.cnblogs.com/cherishthepresent/p/17306554.html

相关文章

  • 使用Shell脚本备份网站目录
    目的:通过Shell脚本运行一键备份压缩到指定文件夹cd/tmp/backup/touchtest0622.sh如下:#!/bin/bashdir="/www/wwwroot/mefj.com.cn"backup="/tmp/backup"filename="wordpress.tar.gz"date=`date+%Y%m%d`[!-e"$dir"]&&echo"......
  • 使用Xshell远程连接Linux服务器
     https://blog.csdn.net/weixin_48016395/article/details/123190779?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-2-123190779-blog-129054565.235^v28^pc_relevant_default&spm=1001.2101.3001.4242.2&utm_rele......
  • shell读取配置文件-sed命令
    在编写启动脚本时,涉及到读取配置文件,特地记录下shell脚本读取启动文件的方式。主要提供两种格式的读取方式,方式一配置文件采用“[]”进行分区,方式二配置文件中需要有唯一的配置项名称。配置文件格式如下:#cat-nconfig.ini1#MYSQL配置项2[MYSQL]3DB_HOST......
  • you-get下载视频脚本
     #!/usr/bin/python3#-*-coding:utf-8-*-#CreatedbyiFantasticon2020/8/7#用于视频下载(B站等)importsysfromyou_getimportcommonasyou_get#导入you-get库definfo():"""下载当前连接下1到10集视频:return:"""directory=r'/opt/......
  • mysql数据库的登录脚本
    ######################## ku脚本:可以使用以下ku脚本,它可以根据提供的参数登录到MySQL数据库:#!/bin/bash#Checkforcorrectnumberofargumentsif[$#-lt1];thenecho"Usage:$0<ip>[<port>][<mysqloptions>]"exit1fi#SettheIPaddress......
  • python+selenium写自动化脚本遇到的坑
    1.定位不到元素网速不好定位的元素还没有刷新出来使用等待有三种强制等待,显式等待,隐式等待动态ID不要复制xpath,要手写。判断是动态ID的方法,多次关闭浏览器再打开网址,查看ID是否会发生变化下拉框,文件无法定位还没有解决......
  • postman使用脚本和接口嵌套批量执行
    一.使用脚本自动填充数据编写脚本 //生成随机字符串functionrandomString(minValue,maxValue,dataSet='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'){if(!minValue){minValue=20;maxValue=20;}if(......
  • 常见webeshell工具流量分析
    中国菜刀虚拟机使用仅主机模式,开启apache服务,使用wireshark对此网卡进行抓包  追踪http数据流  base64解码得出<?php@ini_set("display_errors","0");@set_time_limit(0);if(PHP_VERSION<'5.3.0'){@set_magic_quotes_runtime(0);};echo("X@Y&qu......
  • shell 变量赋值
    shell变量赋值1.read进行赋值  read的脚本中示例语法[root@localhost~]#vimread-1.sh[root@localhost~]#catread-1.sh#!/bin/bashread-p"请输入一个值"Varecho"您输入的变量值为$Var"[root@localhost~]#shread-1.sh请输入一个值oldboy您输入的变量值为old......
  • shell简介
     1.什么是Shellshell就是一个命令解释器。shell分为交互式shell和非交互式shell.交互式shell就是命令行上一条一条命令的执行。非交互式shell就是以脚本的方式运行。通过变量$-来查看是否是交互式或非交互式shell[root@localhost~]#echo$-    #命令行上的执......