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

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

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


专栏订阅入口

| 精选文章 | 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.xdnf.cn/news/147527.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【RH124】解释Linux文件系统权限

RH124教材中控制对文件的访问一章中有一道解释Linux文件系统权限的测验题&#xff0c;可以一起来看看&#xff1a; 一、权限解释 这是通过 ls -l 命令查看的结果。它显示了文件或目录的权限、拥有者、所属组等信息。 1、长列表的第一个字符表示文件类型&#xff1a; -是常…

【C语言零基础入门篇 - 16】:栈和队列

文章目录 栈和队列栈栈功能的实现源代码 队列队列功能的实现源代码 栈和队列 栈 什么是栈&#xff1a;功能受限的线性数据结构 栈的特点&#xff1a;先进后出 。例如&#xff1a;仓库进货、出货。 栈只有一个开口&#xff0c;先进去的数据在栈底&#xff08;bottom&#xf…

STM32篇:STM32CubeMX的安装

一.介绍与安装 1.作用 通过界面的方式&#xff0c;快速生成工程文件。 2.下载 官网 https://www.st.com/zh/development-tools/stm32cubemx.html#overview 3.安装 一路下一步&#xff0c;建议不要安装在C盘 4.配置 更新固件包位置&#xff08;比较大&#xff0c;默认在…

LeetCode 257. 二叉树的所有路径(回溯详解)

文章目录 LeetCode 257. 二叉树的所有路径思路递归版本一:非常明确的回溯代码版本二&#xff1a;精简的回溯代码 LeetCode 257. 二叉树的所有路径 LeetCode 257. 二叉树的所有路径 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节…

全网最适合入门的面向对象编程教程:51 Python函数方法与接口-使用Zope实现接口

全网最适合入门的面向对象编程教程&#xff1a;51 Python 函数方法与接口-使用 Zope 实现接口 摘要&#xff1a; 在 Python 中&#xff0c;Zope 提供了一种机制来定义和实现接口。Zope 的接口模块通常用于创建可重用的组件&#xff0c;并确保组件遵循特定的接口规范。 原文链…

力扣 209.长度最小的子数组

一、长度最小的子数组 二、解题思路 采用滑动窗口的思路&#xff0c;详细见代码。 三、代码 class Solution {public int minSubArrayLen(int target, int[] nums) {int n nums.length, left 0, right 0, sum 0;int ans n 1; for (right 0; right < n; right ) { …

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目&#xff1a; 大数据驱动的…

一劳永逸:用脚本实现夸克网盘内容自动更新

系统环境&#xff1a;debian/ubuntu 、 安装了python3 原作者项目&#xff1a;https://github.com/Cp0204/quark-auto-save 感谢 缘起 我喜欢看电影追剧&#xff0c;会经常转存一些资源到夸克网盘&#xff0c;电影还好&#xff0c;如果是电视剧&#xff0c;麻烦就来了。 对于一…

深度学习-卷积神经网络(CNN)

文章目录 一、网络构造1. 卷积层&#xff08;Convolutional Layer&#xff09;&#xff08;1&#xff09;卷积&#xff08;2&#xff09;特征图计算公式&#xff08;3&#xff09;三通道卷积 2. 激活函数&#xff08;Activation Function&#xff09;3. 池化层&#xff08;Pool…

【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1. 基本 API 介绍2. 简单用法3. 应用场景4. Threadlocal与Synchronized区别5. 内存溢出和内存泄漏5.2 内存溢出 (Memory Overflow)5.2 内存泄…

全栈项目小组【算法赛】题目及解题

题目&#xff1a;全栈项目小组【算法赛】 题目&#xff1a; 解题思路 1.遍历简历信息&#xff1a;我们需要读取所有简历&#xff0c;根据期望薪资和岗位类型进行分类和统计。 2.分类统计&#xff1a;使用哈希表来存储每个薪资下的前端&#xff08;F&#xff09;和后端&#…

【线程】线程的同步

本文重点&#xff1a;理解条件变量和生产者消费者模型 同步是在保证数据安全的情况下&#xff0c;让我们的线程访问资源具有一定的顺序性 条件变量cond 当一个线程互斥地访问某个变量时&#xff0c;它可能发现在其它线程改变状态之前&#xff0c;它什么也做不了&#xff0c;…

window系统DockerDesktop 部署windows容器

目录 参考文献1、安装Docker Desktop1.1 下载安装包1.2 安装教程1.3 异常解决 2、安装windows容器2.1 先启动DockerDesktop 软件界面2.2 检查docker版本2.3 拉取windows镜像 参考文献 windows容器docker中文官网 Docker: windows下跑windows镜像 1、安装Docker Desktop 1.1 …

SSM框架VUE电影售票管理系统开发mysql数据库redis设计java编程计算机网页源码maven项目

一、源码特点 smm VUE电影售票管理系统是一套完善的完整信息管理类型系统&#xff0c;结合SSM框架和VUE、redis完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用ssm框架&#xff08;MVC模式开发&#xff09;&#xff0c;系 统具有完整的源代码和数据库&#…

【C语言零基础入门篇 - 17】:排序算法

文章目录 排序算法排序的基本概念冒泡排序选择排序插入排序 排序算法 排序的基本概念 1、什么是排序&#xff1f; 排序是指把一组数据以某种关系&#xff08;递增或递减&#xff09;按顺序排列起来的一种算法。 例如&#xff1a;数列 8、3、5、6、2、9、1、0、4、7 递增排序…

深入浅出:Eclipse 中配置 Maven 与 Spark 应用开发全指南

Spark 安装配置 1.在 Eclipse 中配置 Maven Eclipse 中默认自带 Maven 插件&#xff0c;但是自带的 Maven 插件不能修改本地仓库&#xff0c;所 以通常我们不使用自带的 Maven &#xff0c;而是使用自己安装的&#xff0c;在 Eclipse 中配置 Maven 的 步骤如下&#xff1a;…

Nature Electronics |无感佩戴的纤维基电子皮肤(柔性半导体器件/柔性健康监测/电子皮肤/柔性传感/纤维器件)

英国剑桥大学Yan Yan Shery Huang课题组,在《Nature Electronics 》上发布了一篇题为“Imperceptible augmentation of living systems with organic bioelectronic fibres”的论文,第一作者为王文宇博士(Wenyu Wang),论文内容如下: 一、 摘要 利用电子技术对人类皮肤和…

0-PCIE串行高速接口架构介绍

随着计算机技术日新月异的发展&#xff0c;对于I/O传输速率的需求愈发提高&#xff0c;PCI总线由于是并行传输&#xff0c;在时钟频率提高之后会带来信号偏移和串扰的问题从而使信号衰减失真&#xff0c;同时在数据传输速率不断提高之后PCI总线还面临着管脚限制&#xff0c;传输…

哈电集团数智化转型新突破:浪潮信息SAP HANA驱动数智升级

浪潮信息SAP HANA一体化解决方案&#xff0c;鼎力推动哈尔滨电气集团有限公司&#xff08;哈电集团&#xff09;取得了数字化转型的非凡成就。该定制化方案不仅促使哈电集团业财一体化程度显著跃升&#xff0c;突破70%大关&#xff0c;更确保了库存管理的绝对精准&#xff0c;库…

【C++前缀和 排序】2171. 拿出最少数目的魔法豆|1748

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode2171. 拿出最少数目的魔法豆 难度分&#xff1a;1748 给定一个 正整数 数组 beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋…