对于shell脚本,是否有像Lint或Perl::Critic这样的静态分析工具?

对于shell脚本,是否有像Lint或Perl::Critic这样的静态分析工具?,shell,static-analysis,checkstyle,Shell,Static Analysis,Checkstyle,是否有任何shell(特别是bash或ksh)检查器来测试shell脚本的样式、最佳实践、命名约定等?(类似于C的Lint,或者Perl的Perl::Critic。) 我知道使用ksh可以通过运行ksh-nscript.ksh来进行语法检查,但我希望的不仅仅是sytax检查,而是解析/分析实际代码的东西 我可能运气不好,但我想问一下也没什么坏处。Debian和Ubuntu项目使用一个脚本,它寻找可能表明某人依赖于/bin/sh成为bash的特定模式 除此之外,大多数shell都有一个-n选项来解

是否有任何shell(特别是bash或ksh)检查器来测试shell脚本的样式、最佳实践、命名约定等?(类似于C的Lint,或者Perl的Perl::Critic。)

我知道使用ksh可以通过运行
ksh-nscript.ksh
来进行语法检查,但我希望的不仅仅是sytax检查,而是解析/分析实际代码的东西


我可能运气不好,但我想问一下也没什么坏处。

Debian和Ubuntu项目使用一个脚本,它寻找可能表明某人依赖于
/bin/sh
成为
bash
的特定模式

除此之外,大多数shell都有一个
-n
选项来解析和报告错误。您可以对照几个不同的shell检查脚本,以确保它只使用可移植语法:

for shell in zsh ksh bash dash sh
do
  echo "Testing ${shell}"
  ${shell} -n my_script.sh
done
编辑以添加:自编写此答案以来,已按照建议进行了编写。这比以前的建议更彻底地处理shell脚本。

:它测试引用中的常见错误和其他您忽略的东西(“因为它有效”)。

我写了一封信来包装checkbashims和Brian回答中提供的shell的其他基本linting选项


它可以通过rubygems(
gem install shlint
)作为一种噱头来安装,但您只需要perl(用于checkbashims)和一个兼容POSIX的shell来解释shlint命令本身。应该可以在OSX和Ubuntu上开箱即用。

很酷-这个脚本看起来很有前途!从我找不到任何其他东西和缺乏回应来看,我想说这可能是唯一能做这种事情的东西。非常感谢!是我还是这个选项不在bash或zsh的手册页中?为什么21世纪的bash解释器不能给出一个更有用的信息,比如“如果”第23行没有匹配的“fi”…,而不是像这样令人沮丧的无用的废话?$bash-n/tmp/baa.sh/tmp/baa.sh:第56行:语法错误:文件$zsh的意外结尾-n/tmp/baa.sh/tmp/baa.sh:56:在“\n”@BrianCampbell附近的解析错误太棒了!我打算为这一小片段进行回购!该脚本可以对多个shell的脚本执行基本语法检查,这很有帮助,但它实际上没有回答@BrianH关于解析/分析的问题。遗憾的是,它依赖于Haskell。这很好,但是haskell是一个很大的依赖项。@Shurane-依赖项只在构建时需要,而不是在运行可执行文件时需要。看起来唯一的依赖项是浏览器。我刚刚发现shellcheck也是一个非常有用和简单的工具。很好的提示;在OSX上,您现在还可以通过以下方式安装shellcheck.net CLI,
shellcheck
:brew install shellcheck。