以下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
。
答案 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兼容检查。我不知道该模式的详细程度如何正确。