本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)
【Linux】全面讲解 Shell 变量的那些事
目录
一、基本介绍
1、Shell 编程
2、Shell 脚本
二、编程规范
三、检查工具推荐
1、ShellCheck 简介
2、ShellCheck 使用
一、基本介绍
1、Shell 编程
Shell 编程是指使用 Shell 命令作为程序语言,设计、编写、测试、维护脚本型程序的过程,Shell 命令是 Shell 编程的实现语句和实现方法,Shell 脚本则是 Shell 编程的实现产物。
此外,Shell 编程还会涉及到以下几个方面的内容:
- 对 Shell 环境的理解
- 对变量和函数的使用
- 对条件语句、循环控制语句等复杂逻辑的应用
- 对程序错误的处理和调试技巧
2、Shell 脚本
Shell 脚本可以看作是一种按照既定逻辑顺序执行的 Shell 命令集合,可以包含简单操作命令(如 cd、cp、mv 等操作),也可以包含复杂逻辑区块(如条件语句、循环语句、函数等)。Shell 脚本是一种不需要编译的解释性程序,因此具有快速编写、方便测试的特点,有助于运维工程师简化研发流程、提高工作效率。
Shell 脚本主要用于在类 Unix 系统(如 Linux、macOS 等)中完成以下工作:
- 执行批处理任务:如批量安装软件、生成系统配置等
- 实现自动化过程:如自动处理大量文本内容、自动备份数据等
- 管理操作系统:如监控系统资源、与调度工具(Crontab 等)结合定期执行任务等
虽然 Shell 编程与其他主流编程语言相比而言略显粗陋,但笔者认为编程的核心思想应该是一致的。同时为了避免出现异常问题、便于他人阅读和管理,构建 Shell 脚本时也应当遵循一定的编程规范。
本文总结了 20 余条常用编程规范,并推荐一种 Shell 脚本检查工具,帮助大家养成良好的 Shell 编程习惯。
二、编程规范
-
建议在 Shell 脚本创建时,以 .sh 作为文件名结尾,方便识别文件类型
-
建议赋予 Shell 脚本适当的执行权限,允许以 ./xxx.sh 的形式运行脚本;若没有赋予执行权限,只能以 /bin/bash xxx.sh 的形式运行脚本,非 root 用户还需要加上 sudo
-
建议在 Shell 脚本的开头处使用 #! 指定命令行解释器(如 #!/bin/bash)
-
建议在 Shell 脚本的结尾处使用 main "$@" 指定程序的入口,增强脚本的结构化程度
-
建议在 Shell 脚本中通过 $(cd `dirname $0`;pwd) 获取当前脚本的路径,并以此为基准查找其他路径
- 建议在 Shell 脚本的内容中勤用 # 标明注释,充分解释脚本语句或逻辑区块的用途、注意事项等,方便自己和他人阅读,提升理解效率
- 建议对传入 Shell 脚本的参数进行检查(如判断个数是否符合预设),避免脚本运行异常
- 建议 Shell 变量的名称尽量直观易理解且风格统一,形式可以为驼峰型、下划线分隔单词等
- 建议充分考虑环境变量、局部变量在不同 Shell (父 Shell、子 Shell)下的作用域,确保其在被引用时能够生效
- 建议在 Shell 脚本中引用 Shell 变量时,尽量采用 "$var" 或 "${var}" 形式,而不是 $var ,避免因变量值存在空格导致取值异常等问题
- 建议在 Shell 脚本中将多次出现的常量统一赋值给一个变量,方便在常量发生变化后快速修改,提升脚本的可配置能力
- 建议在 Shell 脚本中养成良好的缩进习惯,使脚本内容具有清晰易读的层级结构,有助于避免将直接执行的命令与函数体搞混
- 建议在 Shell 脚本中为关键命令语句的输出添加回显或将其重定向至日志文件,方便在脚本运行出现异常时进行排查和调试;回显可以通过 echo -e "\033[2;32m xxxxxxx \033[0m" 命令设置颜色、高亮等特效提升输出效果
- 建议在 Shell 脚本中使用 >/dev/null 过滤不友好的输出信息,避免因无用信息过多而漏掉重要信息
- 建议在 Shell 脚本中使用绝对路径,避免使用相对路径,否则需要注意目录的切换
- 建议在 Shell 脚本中通过命令语句的返回值 $? 判断命令语句是否执行成功,$? 为 0 时表示执行没有错误
- 建议在 Shell 脚本中处理文件前判断文件是否存在,并做好异常处理
- 建议在 Shell 脚本中使用 [[ ]] 代替 [ ]
- 建议在 Shell 脚本中使用 && 和 || 写成单行形式,替代简单的 if 语句,如用 [[ x > 2 ]] && echo x 替代 if x >2 ;then echo x,以提升执行效率和阅读体验
- 建议在 Shell 脚本中使用 function func() {} 形式来定义函数,而不是 function func {} 形式
- 建议在 Shell 脚本中使用 $(命令) 的形式,将命令的结果赋给变量,而不是 `命令` 形式
- 建议在 Shell 脚本中使用 Shell 变量替换语句,代替 awk、sed 语句处理字符串
- 建议在 Shell 脚本中复制文件夹时使用 cp -r 命令,如果目标文件夹不存在则创建,如果存在则复制为子文件夹
- 建议在 Shell 脚本中尽量不要处理 ls 后的数据,如 for i in $(ls),因为 ls 的结果非常不确定并且与平台有关
- 建议在 Shell 脚本中尝试使用 trap 捕获异常信号,并在接收到终止信号时执行一些收尾工作
- 建议在 Shell 脚本中不要记录密码、密钥等敏感信息
- 建议在 Shell 脚本中出现长命令时,通过反斜杠 \ 进行分行,以提升阅读体验
- 建议在 Shell 脚本中尽量使用精简命令,如采用单条命令代替多条命令或管道命令,提升脚本运行效率
- 建议在 Shell 脚本中存在可以同时执行、互不关联的命令时,采用 & 和 wait 方式实现并发,提升脚本运行效率
- 建议在 Shell 脚本中采用 cat>> filename << EOF 方式将指定内容写入文件,而不是采用 echo xxx >> filename 方式逐行写入
三、检查工具推荐
1、ShellCheck 简介
ShellCheck 是一种静态分析工具,专门用于分析 Shell 脚本。
ShellCheck 的强大之处在于,它不仅能够识别 Shell 脚本中存在的问题,还可以针对性地提供清晰、有效的改进建议,帮助开发者快速定位并修复这些问题,进而提高 Shell 脚本的编写质量和维护效率。
ShellCheck 能够识别的问题包括但不限于:
- 语法错误
- 逻辑漏洞
- 代码风格问题
- 潜在的安全风险
2、ShellCheck 使用
-
方式一:在线检查
访问 ShellCheck 在线服务,粘贴 Shell 脚本内容即可开始自动检查,并输出检查结果。
- 方式二:本地安装后检查
安装方法如下:
# CentOS 系统
yum install -y ShellCheck# Ubuntu 系统
apt install -y shellcheck
使用方法如下:
shellcheck xxx.sh