这款利器帮你查找和修复 Linux Shell 脚本错误

作者阿里云代理 文章分类 分类:新闻快递 阅读次数 已被围观 351

什么是shellcheck?

如果您从事 Linux Bash 开发人员已有一段时间,您可能会在自己的脚本或其他人的脚本中发现大量错误。当我们开发代码时,必然会在代码中引入错误。即使是最优秀的开发人员也可能偶尔会忽略代码中不可预见的复杂性或警告。在 Bash 中,没有像C++那样的真正的编译器。然而,有一组工具可以在开发 Bash 脚本时提供很大帮助。比如 shellcheck。这个优秀的实用程序将解析 Bash 脚本文件并根据分析过程中发现的内容提出建议。这有点像拥有了一个 Bash 编译器。像 shellcheck 这样的工具在操作上与其他运行时工具不同,例如执行脚本bash -x以查看正在执行的脚本中的每个命令,并且是实时的。原因是 shellcheck 将分析脚本(文件)而不实际执行它,这与编译器所做的再次相似。

安装shellcheck

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

复制
linuxmi@linuxmi:~/www.linuxmi.com$ sudo apt install shellcheck1.

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

复制
linuxmi@linuxmi:~/www.linuxmi.com$ sudo yum install shellcheck1.

运行shellcheck

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

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

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

复制
linuxmi@linuxmi:~/www.linuxmi.com$ shellcheck linuxmi.sh1.

编辑搜图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! < startfif1.2.3.4.5.6.

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

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

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

本公司销售:阿里云、腾讯云、百度云、天翼云、金山大米云、金山企业云盘!可签订合同,开具发票。

我有话说: