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

目录

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/bashecho "Hello, World!"if [[ "$1" == "hello" ]]; thenecho "You said hello!"
elseecho "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" ]; thenecho "Backup directory does not exist. Creating it..."mkdir -p "$BACKUP_DIR"
fi# 创建备份文件
tar -czf "${BACKUP_DIR}/${FILENAME}" "$SOURCE_DIR"# 检查备份是否成功
if [ $? -eq 0 ]; thenecho "Backup created successfully."
elseecho "Backup failed."
fi

说明:

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

2. Shell 脚本调试技巧

#!/bin/bashset -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.rhkb.cn/news/388584.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

环境如何搭建部署Nacos

这里我使用的是Centos7, Nacos 依赖 Java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用 ## 1、下载安装JDK wget https://download.oracle.com/java/17/latest/jdk-17_linux-x6…

不同类型游戏安全风险对抗概览(下)| FPS以及小游戏等外挂问题,一文读懂!

FPS 游戏安全问题 由于射击类游戏本身需要大量数值计算,游戏方会将部分计算存放于本地客户端,而这为外挂攻击者提供了攻击的温床。可以说,射击类游戏是所有游戏中被外挂攻击最为频繁的游戏类型。 根据网易易盾游戏安全部门检测数据显示&#…

AWS-负载均衡-创建一个对外的HTTPS ALB

目录 介绍 功能差异 适用场景 性能比较 补充 基本组成部分 创建流程 介绍 Elastic Load Balancing 支持三种类型的负载均衡器:Application Load Balancer、Network Load Balancer 和 Classic Load Balancer。这里用ALB( Application Load Balancer)说明。 功…

聊聊ChatGLM-6B部署与微调的深入理解

前言 ChatGLM的部署,主要是两个步骤: 在Github上下载chatglm的库文件在Hugging Face上下载模型参数与配置文件 ChatGLM包 从Github上看ChatGLM项目文件的结构来看,仅仅是包含三种部署方式的py代码与微调的py代码 而相关的实现细节&#…

黑马JavaWeb后端案例开发(包含所有知识点!!!)

目录 1.准备工作 环境搭建 开发规范 REST(REpresentation State Transfer),表述性状态转换,它是一种软件架构风格 注意事项 统一响应结果 2.部门管理功能 查询部门 删除部门 新增部门 RequestMapping 3.员工管理功能 分页查询 批…

Android 10.0 Launcher 启动流程

在前面SystemUI启动流程中说到,在SystemServer中会去启动各种系统服务,这里的launcher也是启动的其中一个服务ActivityManagerService去启动的。在android10之前,系统四大组件的启动都是在ActivityManagerService中,在android10中…

最短路问题中的朴素版Dijkstra算法

最短路问题的朴素版Dijkstra算法 题目 最短路问题需要用到下面的算法(n代表点的数量,m代表边的数量) 朴素版和堆优化版的Dijkstra算法的区别是,朴素版比较适合稠密图,堆优化版适合稀疏图,稠密图代表它的边…

python | TypeError: list indices must be integers or slices, not tuple

python | TypeError: list indices must be integers or slices, not tuple 在Python编程中,TypeError: list indices must be integers or slices, not tuple 是一个常见的错误。此错误通常发生在尝试使用非整数(如元组)作为列表索引时。本…

RK3568笔记四十九:W25Q64驱动开发(硬件SPI1)

若该文为原创文章,转载请注明原文出处。 一、SPI介绍 串行外设接口 (Serial Peripheral interface) 简称 SPI,是一种高速的,全双工,同步的通信总线,并 且在芯片的管脚上只占用四根线,节约了芯片的管脚。 …

Python写UI自动化--playwright(在UI元素上悬停)

要在UI元素上执行鼠标悬停(hover)动作,可以使用page.hover()方法。这个方法使鼠标指针移动到指定的元素上,就像用户将鼠标悬停在该元素上一样。这对于触发那些依赖于鼠标悬停事件的行为(如显示下拉菜单、提示框或其他动…

[极客大挑战 2019]PHP1

打开题目 游戏界面 猜测php里面有文件,我们可以用dirsearch 扫描一下这个服务器 执行命令 dirsearch -u http://2999dfd5-1d43-4a81-a088-9e41c9dccab4.node4.buuoj.cn/ -e php > test.log 最后在log文件中找到一个 200 www.zip 浏览器输入payload下载下来 …

操作系统_内存管理学习心得

1. 操作系统结构 1.1 内核 计算机是由各种外部硬件设备组成的,比如内存、cpu、 硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人就由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交写&#x…

C++ | Leetcode C++题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };

SpringBoot集成GraalVM创建高性能原生镜像

1. GraalVM 原生镜像的介绍 GraalVM原生镜像为部署和运行Java应用程序提供了一种新的方式。与Java虚拟机相比&#xff0c;原生镜像可以以更小的内存占用和更快的启动时间运行。 它们非常适用于使用容器镜像部署的应用程序&#xff0c;当与 "功能即服务"&#xff08…

短剧系统源码分享,快速搭建部署上线教程

一、短剧系统是什么&#xff1f; 短剧制作平台&#xff0c;作为一站式综合解决方案&#xff0c;集剧本创作、角色设计、场景搭建、视频编辑、便捷发布及深度数据分析能力于一身。该平台精准定位于助力企业利用短剧形式强化品牌传播力并驱动商业价值增长&#xff0c;无论企业是…

什么是IO多路复用?其原理和用途是什么?

什么是IO&#xff1f; IO&#xff1a;Input/Output&#xff0c;即数据的读取&#xff08;接收&#xff09;/写入&#xff08;发送&#xff09;操作&#xff0c;针对不同的数据存储媒介&#xff0c;大致可以分为网络 IO 和磁盘 IO 两种。在 Linux 系统中&#xff0c;为了保证系…

关于Excel表格隔行取列的方法

关于Excel表格隔行取列的方法 1、场景显示2、参考文章 1、场景显示 ①处的公式&#xff1a; INDEX($B3:$G3,(COLUMN(A1)*2)) $B与$G可以限制列不变&#xff1b; COLUMN(A1)返回1&#xff1b; 含义&#xff1a; 在选定区域选择偶数列的数据&#xff1b; 如果是奇数列的话是(COL…

查看RAM和Flash

0 Preface/Foreword 1 查看方法 1.1 map文件中查看 1.1.1 RAM可用情况 在map文件中&#xff0c;搜索字符串&#xff1a;free_ramcp 该字段表示剩余可用的RAM大小&#xff0c;前面对应的是hexadecimal的数值&#xff08;单位Byte&#xff09;&#xff0c;就是剩余可用的RA…

乱弹篇(39)请珍惜懂你的人

今日清晨&#xff0c;笔者照常去到古镇味江河畔垂钓&#xff0c;呼吸着凉爽晨风轻轻吹拂而来的大自然氧吧生产出的优质氧气......忽地&#xff0c;记起已经许久未履行义务了&#xff0c;所以本“人民体验官”今天要推广人民日报官方微博文化产品《有个真朋友是一生的福气》。 截…

Redis:十大数据类型

键&#xff08;key&#xff09; 常用命令 1. 字符串&#xff08;String&#xff09; 1.1 基本命令 set key value 如下&#xff1a;设置kv键值对&#xff0c;存货时长为30秒 get key mset key value [key value ...]mget key [key ...] 同时设置或者获取多个键值对 getrange…