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

mce*_*ceo 5 shell posix static-analysis sh

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

#!/bin/sh
if $1 ; then exit; fi
/tmp/asdf <<< ASDF # Something with syntax error in POSIX
Run Code Online (Sandbox Code Playgroud)

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

编辑:这个问题中已经回答了检查Bash脚本中的语法错误.

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

mce*_*ceo 6

所有与POSIX兼容的Shell命令语言 shell都支持set -n内置,可用于检查脚本的语法.因此可以预先添加

set -n
Run Code Online (Sandbox Code Playgroud)

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

sh -n yourScriptFilename.sh
Run Code Online (Sandbox Code Playgroud)

警告:这并不能保证脚本具有完全POSIX兼容的语法.例如,Bash允许bashisms(例如数组和c{a,u}t)被忽略,即使在使用--posix(和/或+B)命令行选项时除了-n调用时也是如此sh.其他shell可能有类似的问题.


hek*_*mgl 5

bash你可以使用-n:

bash -n file.sh
Run Code Online (Sandbox Code Playgroud)

输出:

a.sh: line 3: syntax error near unexpected token `then'
a.sh: line 3: `if then fi # Something with syntax error'
Run Code Online (Sandbox Code Playgroud)

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

bash --posix -n file.sh
Run Code Online (Sandbox Code Playgroud)

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