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

How to syntax check portable POSIX shell scripts?

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

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

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

编辑: 检查 Bash 脚本中的语法错误已在 this question.

中得到解答

编辑 #2: 请注意 以正确检查语法是否符合 POSIX 即使在使用 +B--posix 标志除了 -n.

有了 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 兼容检查。我不知道posix如何详细更正该模式。

所有 POSIX 兼容 Shell Command Language shells support the set -n 内置,可用于检查脚本的语法。因此可以在前面加上

set -n

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

sh -n yourScriptFilename.sh

警告: 这不能保证脚本具有完全 POSIX 兼容的语法。例如,Bash 允许 bashisms(例如数组和 c{a,u}t)即使在使用 --posix(and/or +B)命令行选项时也不会被注意到-n 当作为 sh 调用时。其他 shell 可能有类似的问题。