linux系统ShellCheck检查shell脚步语法正确的工具

news2025/1/12 13:48:58

目录

ShellCheck

安装ShellCheck 、dnf、yum

源代码编译

步骤如下:

示例命令:

方法三:使用其他第三方仓库、COPR 仓库

假设 ShellCheck 输出如下:

分析输出

修改脚本

再次运行 ShellCheck

1. Shell 脚本最佳实践

主题概述

案例与说明

2. Shell 脚本调试技巧

set -x、bash -n、bash -c、bash -i、说明:


ShellCheck

  1. ShellCheck: ShellCheck 是一个静态分析工具,可以检查 Bash 脚本中的常见错误和潜在问题。它可以作为命令行工具使用,也可以集成到编辑器和 IDE 中。安装 ShellCheck 后,只需运行 shellcheck yourscript.sh 即可。如:

shellcheck renet.sh

 

不同的系统安装Shellcheck软件可能会有不同,软件包是在epel仓库中

安装ShellCheck 、dnf、yum

如:Centos 9

# 添加 EPEL 仓库
dnf install -y epel-release

# 更新仓库列表
dnf makecache fast

# 安装 ShellCheck
dnf install -y shellcheck

 Centos 7

yum -y install epel-release
yum -y install ShellCheck

案例:

源代码编译

如果通过 EPEL 仓库仍然找不到 ShellCheck,你可以考虑从源代码编译安装。ShellCheck 的源代码可以从 GitHub 上获取。

步骤如下:
  1. 安装依赖项:确保安装了必要的构建工具和依赖项。
  2. 下载源代码:从 GitHub 下载 ShellCheck 的最新源代码。
  3. 编译并安装:按照 ShellCheck 提供的说明进行编译和安装。
示例命令:
# 安装依赖项
sudo dnf install -y make bison flex gcc gcc-c++ perl-ExtUtils-MakeMaker

# 下载源代码
git clone https://github.com/koalaman/shellcheck.git
cd shellcheck

# 编译
make

# 安装
sudo make install

方法三:使用其他第三方仓库、COPR 仓库

除了 EPEL 外,还有一些其他的第三方仓库可能已经包含了 ShellCheck 的包。例如,COPR 是一个允许用户创建和分享自定义 RPM 包的平台。

添加 COPR 仓库

dnf copr enable copr.fedorainfracloud.org/copronym/shellcheck
  1. 安装 ShellCheck
dnf install -y shellcheck

假设 ShellCheck 输出如下:

example.sh: line 4: SC2086: Double quote to prevent globbing and word splitting. example.sh: line 6: SC2154: '1' is referenced but not assigned.

分析输出

  1. SC2086: Double quote to prevent globbing and word splitting.

    • 这意味着你在使用变量时没有使用双引号。在这个例子中,ShellCheck 建议我们在 [ "$1" = "hello" ] 这一行使用双引号,即改为 [ "$1" = "hello" ]。这是因为如果没有双引号,变量 $1 的值可能会被 shell 解释为多个单词,导致错误的行为。
  2. SC2154: '1' is referenced but not assigned.

    • 这个警告表示脚本中引用了一个未被赋值的变量 1。这里的 1 实际上应该是 $1,这是一个常见的误报,因为 ShellCheck 试图解析脚本中的语法结构。在这个特定的例子中,$1 已经被正确地使用了,所以这个警告可以忽略。

修改脚本

根据 ShellCheck 的建议,我们可以修改脚本来避免潜在的问题:

#!/bin/bash

echo "Hello, World!"

if [[ "$1" == "hello" ]]; then
    echo "You said hello!"
else
    echo "You didn't say hello."
fi

注意这里我们使用了 [[ ... ]] 代替 [ ... ],这是因为 [[ ... ]] 提供了更多的功能和更好的可读性,并且它处理字符串比较时不需要双引号。

再次运行 ShellCheck

修改脚本后,再次运行 ShellCheck 来确认是否解决了所有的问题:

shellcheck example.sh

1. Shell 脚本最佳实践

主题概述

编写高质量的 shell 脚本涉及到遵循良好的编程习惯和最佳实践。这包括代码的组织、错误处理以及可读性和可维护性的提升。

案例与说明

假设我们要写一个简单的脚本来备份一个目录,并压缩为 tar.gz 文件。

#!/bin/bash

# 设置备份目录和文件名
BACKUP_DIR="/path/to/backup"
SOURCE_DIR="/path/to/source"
TODAY=$(date +%Y-%m-%d)
FILENAME="backup-${TODAY}.tar.gz"

# 检查备份目录是否存在
if [ ! -d "$BACKUP_DIR" ]; then
    echo "Backup directory does not exist. Creating it..."
    mkdir -p "$BACKUP_DIR"
fi

# 创建备份文件
tar -czf "${BACKUP_DIR}/${FILENAME}" "$SOURCE_DIR"

# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "Backup created successfully."
else
    echo "Backup failed."
fi

说明:

  • 函数和模块化: 使用函数可以将复杂的脚本分解为可重用的部分。
  • 清晰的注释: 每一部分都有注释来解释其目的。
  • 错误处理: 使用条件语句来检查目录是否存在,并报告备份的结果。
  • 变量命名: 使用有意义的变量名,如 BACKUP_DIR 和 SOURCE_DIR

2. Shell 脚本调试技巧

#!/bin/bash

set -x  # 开启调试模式

# 创建一个不存在的文件
touch /tmp/noexist.txt

# 读取文件内容
cat /tmp/noexist.txt

set -x、bash -n、bash -c、bash -i、说明:

  • 使用 set -x 进行调试: 显示每一条命令的执行情况。
  • 使用 bash -n 检查语法错误: 在执行前检查语法。
  • 使用 bash -c 运行单行命令: 测试特定的命令或表达式。
  • 使用 bash -i 进入交互式 shell: 用于调试和测试命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968751.html

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

相关文章

vcpkg install libtorch[cuda] -allow-unsupported-compiler

在vcpkg中不懂如何使用 nvcc 的 -allow-unsupported-compiler, 所以直接注释了CUDA中对版本的检查代码. C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include\crt\host_config.h 奇了怪了,我是用的是vs2022,但是还是被检查为不支持的编译器!!! 可以试一下改这…

搭建gitlab代码托管仓库(解决centos7无法使用默认数据源问题)

公司的gitlab由于停电,又崩了,每次停电都会崩掉。所以就想到自己学一下搭建gitlab代码中心,后面在搞一个jenkins自动发版学习一下,慢慢搞吧。 在弄的时候,发现Centos7居然在2024年6月31日停止维护了。这就离谱了&…

职教国培丨高职教师数据分析与挖掘课程实施能力提升培训班莅临泰迪智能科技参观调研

7月28日,由广东机电职业技术学院牵头,广东泰迪智能科技股份有限公司为合作单位的“2024年高职教师数据分析与挖掘课程实施能力提升培训班”老师莅临广东泰迪智能科技股份有限公司产教融合实训基地参观调研,来自广东省各地36位高校教师参与本次…

如何在 Kali Linux 上安装和使用 Docker 和 Docker Compose

Docker 和 Docker Compose 是现代开发者必备的工具,特别是当你需要在不同的环境中部署应用时。本文将详细介绍如何在 Kali Linux 上安装 Docker 和 Docker Compose,并使用它们启动服务。即使你是个技术小白,也能轻松跟随这篇指南完成操作。 …

Ecovadis认证:企业申请Ecovadis认证条件

Ecovadis认证是一种用于评估和评价企业可持续发展绩效的认证体系。该认证由Ecovadis公司提供,目的是帮助公司了解和改善其环境、社会和治理(ESG)实践。 Ecovadis认证主要基于四个方面进行评估:环境、劳工和人权、道德采购以及可持…

Python——记录pip问题(解决下载慢、升级失败问题)

在python开发中,经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢,经常导致超时。 有很多朋友刚刚学Python的时候,会来问为什么pip下载东西这么慢啊? 而且pycharm里面下载库也是非常的慢…

Linux服务器安装MySQL8.0

序号类型地址1MySQLLinux(centos 7.5)服务器安装MySQL5.72MySQLLinux服务器安装MySQL8.03MySQLMySQL操作之概念、SQL约束(一)4MySQLMySQL操作之数据定义语言(DDL)(二)5MySQLMySQL操作之数据操作…

React三原理和路由

代码下载 React 组件通讯原理 setState() 说明 setState() 是异步更新数据的,使用该语法时,后面的 setState() 不要依赖于前面的 setState(),可以多次调用 setState() ,只会触发一次重新渲染: this.setState({ coun…

CPQ报价管理系统 | 成本报价CPQ解决方案

一、成本报价流程现状 1、传统流程 2、业务痛点 ①、数据手工重复输入环节多、易错,为保障准确性需多次复核,影响报价效率 ②、原材波动较大,但是当前询价流程只有一次性,原材成本发生变化,无法及时更新变化提醒报价…

类和对象(作业篇)

简简单单整理一下咱们的小作业,这次的作业比较简单,只有选择题: public class Test{private float f1.0f;int m12;static int n1;public static void main(String args[]){Test tnew Test();} }A:抛开private不说,先看…

解析顺序表【数据结构】

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有线序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就是说是连续的一条线…

HTML 字符集详解及示例

文章目录 摘要引言从ASCII到UTF-8的演变ASCII 字符集ANSI字符集ISO-8859-1字符集UTF-8字符集 示例代码运行Demo小结表格总结未来展望参考资料 摘要 本文介绍了HTML中的字符集演变历史,从最初的ASCII到现代的UTF-8,并提供了设置字符集的示例代码。文中涵…

图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据

深入了解Paper.js:实现SVG和JSON的导入导出功能 Paper.js是一款强大的矢量绘图JavaScript库,非常适合用于复杂的图形处理和交互式网页应用。本文将详细介绍如何在Paper.js项目中实现SVG和JSON格式的导入导出功能,这对于开发动态图形编辑器等…

git reset --soft(回退commit,保留add)

参考博客:git reset --soft命令的使用-CSDN博客感觉博客中举的例子不是很好。读者自行判断。举的例子的场景适合使用revert,撤销就行了。另外建议看下边这篇博客,这篇详细介绍了reset和revert,带图。但是要注意这个reset是hard的&…

mysql 内存一直增长(memory/sql/thd::main_mem_root)

mysql版本 8.0.14 发现过程 查询总内存 SELECT t.EVENT_NAME, t.CURRENT_NUMBER_OF_BYTES_USED FROM performance_schema.memory_summary_global_by_event_name t ORDER BY t.CURRENT_NUMBER_OF_BYTES_USED DESC;前: memory/sql/thd::main_mem_root 1…

第十五天啦 2024.8.1 (Spring框架)

1.从宏观上看spring框架和springboot Spring框架解决了企业级的开发的复杂性,它是一个容器框架,用于装java对象(Bean),使程序间的依赖关系交由容器统一管理,松耦合,提高了可测试性和维护效率&a…

网络原理的TCP/IP

TCP/IP协议 1)应用层 应用层和应用程序直接相关,与程序员息息相关的一层协议,应用层协议,里面描述的内容,就是写的程序,通过网络具体按照啥样的方式来进行传输,不同的应用程序,就可以用不同的应用层协议,在实际开发的过程中,需要程序员自制应用层协议 应用层协议本质上就是对…

主题巴巴WordPress主题合辑打包下载+主题巴巴SEO插件

主题巴巴WordPress主题合辑打包下载,包含博客一号、博客二号、博客X、门户一号、门户手机版、图片一号、杂志一号、自媒体一号、自媒体二号和主题巴巴SEO插件。

5行代码快速Git配置ssh

0 流程步骤 检查本地主机是否已经存在ssh key生成ssh key获取ssh key公钥内容(id_rsa.pub)复制该内容,到Github账号上添加公钥,进入Settings设置验证是否设置成功 1 代码 # 1.检查本地主机是否已经存在ssh key cd ~/.ssh ls # …

Notepad++ 安装 compare 插件

文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述