【Linux】Shell 编程规范及检查工具推荐

devtools/2024/9/23 7:23:42/

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | 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


http://www.ppmy.cn/devtools/115883.html

相关文章

golang操作mysql利器-gorm

1、傻瓜示例 GORM通过将数据库表中的数据映射到面向对象的模型中&#xff0c;简化了数据库操作&#xff0c;使得开发者可以很方便的使用代码来操作数据库&#xff0c;而无需编写SQL语句。 目前有个mysql表&#xff1a;miniprogram_orders&#xff0c;其存储了所有用户对应的订…

AI Prompt写作指南:打造高效Prompt的四大核心元素

1. 引言 各位同学,大家好!今天我们要探讨一个非常重要的技能:如何编写高效的Prompt。Prompt就像是我们与AI沟通的“语言”,能帮助我们更好地完成任务,尤其是在创建聊天机器人等自动化任务时更为重要。 四个核心元素就是我们今天讨论的重点,它们是: 角色扮演(Role) 任…

Tomcat 靶场攻略

CVE-2017-12615 步骤一&#xff1a;环境搭建 cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d docker ps 步骤二&#xff1a;漏洞复现 http://192.168.10.190:8080/ 步骤二&#xff1a;首页进行抓包 Tomcat允许适⽤put⽅法上传任意⽂件类型&#xff0c;但不允许js…

MySQL update 一条语句的过程

查询阶段 连接器&#xff1a;建立连接&#xff0c;校验用户身份解析 SQL&#xff1a;通过解析器对 SQL 语句进行词法分析、语法分析&#xff0c;构建语法树。执行 SQL&#xff1a; 预处理阶段&#xff1a;检查表或字段是否存在&#xff1b;将 * 扩展为表上的所有列。优化阶段&…

ROS第五梯:ROS+VSCode+C++单步调试

解决问题&#xff1a;在ROS项目中进行断点调试。 第一步&#xff1a;创建一个ROS项目或者打开一个现有的ROS项目。 第二步&#xff1a;修改c_cpp_properties.json 增加一段命令: "compileCommands": "${workspaceFolder}/build/compile_commands.json"第三…

iOS界面布局:屏幕尺寸与安全区域全面指南

引言 随着iPhone和iPad的更新迭代&#xff0c;iOS设备的屏幕尺寸和设计也在不断变化。无论是iPhone X系列的刘海屏&#xff0c;还是最新的iPhone 14&#xff0c;开发者都需要面对适配不同设备布局的问题。在项目开发中&#xff0c;导航栏、状态栏、TabBar的高度以及安全区域的…

c++~输入函数

字符串输入 方法 描述 优点 缺点 cin 使用 cin 直接读取字符串。 简单易用。 只能读取到第一个空格之前的字符串&#xff0c;换行结束输入。 getline(cin, str) 使用 getline 从 cin 读取一整行。 可以读取含有空格的整行文本。 相对于 cin&#xff0c;使用稍微复杂…

大话Python|基础语法(上)

一、单行注释 以下代码输出一个Hello World&#xff01;字符串 在Python代码中&#xff0c;注释会自动被Python解析器忽略 print(Hello World) 二、多行注释 在Python代码中&#xff0c;注释一共有两种形式&#xff1b; 1、单行注释&#xff1a;注释的内容只有一行 2、多行…