如何语法检查可移植 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 可能有类似的问题。
以下 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: 请注意 +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 可能有类似的问题。