3

格式化 Shell 脚本利器,轻松理解复杂代码

 2 years ago
source link: https://os.51cto.com/article/705054.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

111f19e50e2aceb4fa88926a86539470e32de1.jpg

什么是shfmt?

shfmt 由 Dustin Krysak 开发,是一个 Shell 格式化程序、解析器和解释器。该项目本身托管在 GitHub 上,并有一个清晰的 README 和清晰的存储库。该工具是用 Go 开发的,支持 POSIX、Bash 和 mksh shell。这使得 shfmt 成为一个真正通用的程序,而不是仅限于 Bash。

安装shfmt

要在支持 snap 的 Linux 发行版(如 Ubuntu 和 Mint)上安装shfmt,请在终端中执行以下命令:

linuxmi@linuxmi:~/www.linuxmi.com$ sudo snap install shfmt

52dd47e94406e32efe7594343c5e3a97513012.jpg

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

注意:在执行第一个命令后和执行下一个命令之前,您必须重新启动计算机(或注销并重新登录)。

sudo dnf install snapd
sudo snap install snap-store
sudo snap install shfmt

在 RHEL 和 Centos 上,您可能还必须先安装EPEL 存储库。

使用 shfmt

安装 snap 包后,您可以开始使用 shfmt。

linuxmi@linuxmi:~/www.linuxmi.com$ shfmt --help

c928c675829acccd08c589aa5c7698f55ad83a.jpg

让我们先定义一个非常糟糕的格式和编写的脚本,linuxmi.com.sh如下图所示。

这个脚本有几个问题,最突出的是它的格式。但是脚本中也有一个error/bug:func最后一行的函数调用后面跟着括号。Bash 中的函数调用(而不是函数定义)应该只有名称,而不是括号。

让我们看看shfmt对此有何看法。

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

924eb9115169091e3ec628f5321ac0840bd832.jpg

虽然输出看起来有点晦涩,但请注意术语foo(此处使用)和bar(现在此处未使用)经常在 IT 圈子中用于indicate/represent 任何类似的习语或元素。foo这里真的是指func。

即便如此,该消息仍然有点晦涩,最后一行,真正发生的是函数定义(而不是函数调用)的开始,因为包含了两个括号。这就解释了为什么该消息告诉我们需要更多的东西;后面必须有一个声明。shmft在这里寻找类似func(){ some_command[s]; }的东西。

答对了!这增加了shfmt作为 shell 脚本验证/检查器工具的功能,非常方便!

我们修复了我们刚才的错误,现在输入脚本linuxmi.sh如下图所示。

我们再次对代码执行shfmt并收到更合适且格式正确的输出:

645f05f65b1e38f6aea885f3ad03cce698c1b8.jpg

太好了。现在,我们可以更进一步,并告诉shfmt我们希望使用两个空格的缩进/制表符宽度而不是完整的制表符。我总是使用两个空格作为缩进/制表符宽度来编写代码,并在下一行的命令与前一行密切相关的地方使用额外的空格,比如一个连续的命令等等,尽管这种情况并不经常发生。多年来,我发现这两个空间是个人和共享项目的理想选择。

每个人和每个项目都必须找到自己理想的语法,但请注意,如果您使用像shfmt上面示例中呈现的格式那样的大制表符(8 个空格),您的代码可能会变得更难阅读。

2530e8734e21918d15a113bcaa20e5da986941.jpg

我们将使用-i选项将缩进/制表符宽度设置为两个空格(--help定义为缩进:0 表示制表符(默认),>0 表示空格数):shfmt -i 2 linuxmi.sh这将上图中的脚本呈现如下图。

太棒了!然而,我们注意到,我们故意犯的错误shfmt并没有检测到:#!/bin/bash__是不正确,应该使用#!/bin/bash代替。

e40a45396cdb191ef893834acefe38f75802b8.jpg

因此,除了使用shfmt更好地格式化脚本之外,还有使用shellcheck来查找脚本错误的用例。(见:https://www.linuxmi.com/shellcheck-bugs-linux-shell.html)。然而,有趣的是,在这种特殊情况下,甚至shellcheck没有注意到这个问题。这个缺陷已报告给 shellcheck 团队,因此可能会在适当的时候得到修复。

当您使用像shfmt这样的shell 格式化工具(如shellcheck)这样的bug/错误检查器时,编写干净、格式良好、没有bug的脚本就变得很容易了。正如我们所看到的,有些事情可能直到第一次运行脚本时才被注意到。shfmt是一个小而有效的工具,它将帮助您根据您选择的缩进格式化您的脚本和代码。

好好享受吧。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK