有没有像Lint或Perl::Critic一样的静态分析工具适用于Shell脚本?

48

是否有任何一种shell(特别是bash或ksh)检查器,可以检测shell脚本的风格、最佳实践、命名约定等?(类似于用于C的Lint或用于Perl的Perl ::Critic。)

我知道使用ksh可以通过运行ksh-n script.ksh进行语法检查,但我希望能够进行更多的操作,例如解析/分析实际代码?

我可能没那么幸运,不过问问也无妨。

3个回答

46

我发现了ShellCheck: 它可以测试常见的引号和其他易被忽略错误(因为它们看起来似乎没问题)。


1
很遗憾它依赖于Haskell。虽然Haskell不错,但是作为一种庞大的依赖项。 - Ehtesh Choudhury
2
@Shurane - 这个依赖只是编译时需要的,不会影响可执行文件的运行。 - Deer Hunter
2
似乎唯一的依赖是浏览器。 - msanford
1
我刚刚也发现了Shellcheck,它是一个非常有用且易于使用的工具。 - Simon Michael
1
很好的提示;在OSX上,你现在也可以通过Homebrew安装shellcheck.net CLI工具shellcheckbrew install shellcheck - mklement0
显示剩余2条评论

35

Debian和Ubuntu项目使用一个名为checkbashisms的脚本,它查找可能表明某人依赖于/bin/shbash的特定模式。

除此之外,大多数shell都有一个-n选项来解析和报告错误。您可以将脚本与多个不同的shell进行比较,以确保它仅使用可移植的语法:

for shell in zsh ksh bash dash sh
do
  echo "Testing ${shell}"
  ${shell} -n my_script.sh
done

编辑后添加: 从写这篇答案开始,shellcheck 已经被开发出来了,正如后来的回答所建议的那样。它比之前的建议更彻底地检测 shell 脚本。


很酷 - 那个脚本看起来很有前途!考虑到我未能找到任何其他内容并缺乏回复,我想这可能是唯一一个做这种事情的脚本。非常感谢! - BrianH
1
这是我的问题还是bash和zsh的man页面中没有这个选项? - log0
1
为什么21世纪的Bash解释器不能给出更有用的消息,例如“第23行的'if'没有匹配的'fi'...”,而不是像这样令人沮丧的无用废话?$ bash -n /tmp/baa.sh /tmp/baa.sh: 第56行:语法错误:意外的文件结尾$ zsh -n /tmp/baa.sh /tmp/baa.sh:56: 附近的解析错误`\n' - MarkHu
@BrianCampbell 非常棒!我计划分叉一个仓库,专门用于那个代码片段! - apennebaker
这个脚本可以对多个shell的脚本执行基本语法检查,这很有帮助,但它并没有回答@BrianH关于解析/分析的问题。 - morgant

9

我编写了shlint来包装checkbashims和其他基本的 shell 代码检查选项,这些选项在Brian的回答中提供。

它可以通过rubygems进行安装(gem install shlint),实际上只是一种玩笑,但你只需要perl (用于checkbashims) 和一个符合POSIX标准的shell来解释shlint命令本身。应该可以在OSX和Ubuntu上直接使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接