通过shellcheck查找和修复 Linux Shell 脚本错误

在Linux/Unix平台下编写Bash的时候,shellcheck是一款不错的工具。当编译大量的Bash代码的,常常会花掉大量的时间,然而通过shellcheck你可以提前知道脚本的语法问题,shellcheck也会给出纠错提示。

安装shellcheck

要在基于 Debian/Apt 的 Linux 发行版(如 Ubuntu 和 Mint)上安装shellcheck,请在终端中执行以下命令:

linuxmi@linuxmi:~/www.linuxmi.com$ sudo apt install shellcheck

要在基于 RedHat/Yum 的 Linux 发行版(如 RHEL、Centos 和 Fedora)上安装shellcheck,请在终端中执行以下命令:

linuxmi@linuxmi:~/www.linuxmi.com$ sudo yum install shellcheck

运行*shellcheck*

在安装了 shellcheck 后,我们就可以用一个损坏的脚本做一个简单的测试。首先我们定义我们的脚本linuxmi.com.sh如下:

#!/bin/hashecho 'Bash 不是 Hash echo 为我回应更多错误www.linuxmi.com" if [ -d ./linuxmi }; than  echo 'sure! 

你能找到多少bug?(提示:有 8 个!)。接下来让我们看看 shellcheck 对这段代码的影响:

linuxmi@linuxmi:~/www.linuxmi.com$ shellcheck linuxmi.sh

1、它立即在第一行发现shebang规范存在问题。我们的 shebang 这一行#!/bin/hash应该是#!/bin/bash。让我们解决这个问题。问题 1/8 已修复!我们还将同时修复 shellcheck 立即识别的另外两个问题:2、您是否忘记关闭这个单引号字符串?(Did you forget to close this single quoted string?),对于第二行:很准!问题 2/8 已修复。3、对于第三个问题,我们/开发人员对 shellcheck 的意图有点混乱,这是可以预料的,因为第2 行打开了一个字符串,该字符串'仅在第 5 行看到另一个'时才终止!由于第三个问题是第二个问题的结果,因此这次运行将允许我们暂时修复两个问题。我们的脚本现在看起来像这样:

#!/bin/bashecho 'Bash 不是 Hash'echo 为我回应更多错误www.linuxmi.com" if [ -d ./linuxmi }; than  echo 'sure! 

在进行更正后,让我们再次运行 shellcheck,看看输出是什么。在这种情况下,shellcheck 看到一个 "在第 3 行打开(即使它在行尾,它实际上是一个打开的双引号),并且即使在脚本结尾(注意第 8 行的指示,这在我们的6行脚本中并不存在,在最后一行之后只有一个空行。让我们清理这一空行,并修复第3行开头的双引号问题,现在可以很容易地理解。问题3/8已修复!我们的脚本现在看起来像这样:

#!/bin/bashecho 'Bash 不是 Hash'echo "为我回应更多错误www.linuxmi.com"if [ -d ./linuxmi }; than
 echo 'sure! 

重新运行 shellcheck(注意这些步骤与在其他编码语言中使用编译器有多么相似):再清楚不过了;提到的语法错误出现在这个 if 表达式中,并且预期测试将在这里结束。我们将按照建议进行操作并将 }更改为],使该行变为if [ -d ./linuxmi ]; than. 问题 4/8 已修复!我们重新运行 shellcheck,现在显示以下内容:另一个单引号问题。我们已经知道如何解决这些问题。让我们更改echo 'sure! 为echo 'sure!' (问题 5/8 已修复!)并再次重新运行 shellcheck:有趣的是,我们看到 shellcheck 无法解析一行。虽然这看起来像是 shellcheck 中的一个缺点,但进一步阅读,我们会发现then中的 e 应该为 a。哦哦!我们要放置than而不是then. 多么粗心的错误 很容易修复(问题 6/8 已修复!)。我们的脚本现在看起来像这样:

#!/bin/bashecho 'Bash 不是 Hash'echo "为我回应更多错误www.linuxmi.com"if [ -d ./linuxmi ]; then
 echo 'sure!' 

另一个 shellcheck 运行为我们提供了另一个有用的信息:我们把fi弄丢了!哦哦,是的,fif不行。我们要在脚本的最后一行更改fiffi。(问题 7/8)修复。并再次运行 shellcheck!重定向问题。老实说,我没想到shellcheck也会发现这个错误,因为它也可以在 Bash 中使用,但它确实发现了。事实上,我们的重定向是为了>代替.问题 8/8 – 所有问题 – 已修复!这就引出了最后一个脚本

#!/bin/bashecho 'Bash 不是 Hash'echo "为我回应更多错误www.linuxmi.com"if [ -d ./linuxmi ]; then
 echo 'sure!' > start
fi

让我们看看 shellcheck 现在是怎么想的。完美的!从第一次执行开始,脚本运行完美。如果您查看各种 shellcheck 命令的输出,您还会注意到 shellcheck 的另一个非常方便的功能。尤其是对于初学者:显示一组超链接(网站链接),可以在终端窗口中单击鼠标,或者您可以选择(如有必要)> 右键单击以复制然后粘贴到浏览器中。单击此类链接将带您进入shellcheck GitHub 项目。

想要快速检查

如果您只想快速检查最重要的选项,您可能希望查看该--severity={SEVERITY}选项,您可以将{SEVERITY}其中的一个替换为error, warning, info, style.因此,您只是在寻找错误和警告,您将使用--severity=warning(包括更高级别,在这种情况下仅为error)作为shellcheck的选项。

总结

如果脚本中的逻辑没有问题,则shellcheck在执行脚本之前运行并修复所有发现的问题将确保第一次运行时准完美。您甚至可以在该编码挑战中使用 shellcheck 进行下一次现场 Bash 编码面试!在本文中,我们探讨了脚本中可能出现的各种问题以及如何shellcheck处理它们。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/221010.html<

(0)
运维的头像运维
上一篇2025-04-14 20:17
下一篇 2025-04-14 20:18

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注