如何语法检查可移植的POSIX shell脚本?

时间:2016-04-27 10:25:02

标签: shell posix sh static-analysis

以下shell脚本在为第一个参数提供/bin/true时执行良好,但在执行期间可能会因语法错误而失败!

#!/bin/sh
if $1 ; then exit; fi
/tmp/asdf <<< ASDF # Something with syntax error in POSIX

当然,静态检查可以避免一些语法错误(如果不是全部?)? 如何静态检查给定的Shell Command Language脚本在语法上是否有效?

编辑:在this question中已经回答了检查Bash脚本中的语法错误。

编辑#2:请注意,Bash fails要正确检查语法是否符合POSIX,即使使用+B--posix标志执行也是如此-n

2 个答案:

答案 0 :(得分:6)

所有与POSIX兼容的Shell Command Language shell都支持set -n内置函数,可用于检查脚本的语法。因此可以预先添加

set -n

到您的代码进行语法检查。另请注意,还需要标准sh实用程序来支持命令行-n标志,该标志与使用set -n具有相同的语义。 Bash和可能的其他shell也支持此命令行标志。因此,您只需运行以下语法检查脚本:

sh -n yourScriptFilename.sh

警告:这并不能保证脚本具有完全POSIX兼容的语法。例如,即使在c{a,u}t之外使用--posix(和/或+B)命令行选项时,Bash仍然允许基本原理(例如数组和-n)被忽视调用为sh。其他炮弹也可能有类似的问题。

答案 1 :(得分:5)

使用bash,您可以使用-n

bash -n file.sh

输出:

a.sh: line 3: syntax error near unexpected token `then'
a.sh: line 3: `if then fi # Something with syntax error'

由于bash支持您可以运行的--posix选项

bash --posix -n file.sh

执行posix兼容检查。我不知道该模式的详细程度如何正确。