如何在不运行Bash脚本的情况下检查它的语法?

是否有可能检查bash脚本语法而不执行它?

使用Perl,我可以运行perl -c 'script name'。bash脚本是否有等效的命令?

268294 次浏览
bash -n scriptname

也许有一个明显的警告:这只验证语法,但不会检查你的bash脚本是否试图执行不在你路径上的命令,比如ech hello而不是echo hello

sh  -n   script-name
< p >运行这个。如果脚本中有语法错误,则返回相同的错误消息。 如果没有错误,则输出时不给出任何消息。你可以使用echo $?立即检查,它将返回0确认成功,没有任何错误

这对我很有效。我运行在Linux操作系统,Bash Shell。

我还在我写的每个bash脚本上启用了'u'选项,以便做一些额外的检查:

set -u

这将报告未初始化变量的使用情况,如以下脚本'check_init.sh'

#!/bin/sh
set -u
message=hello
echo $mesage

运行脚本:

$ check_init.sh

将报告以下内容:

./check_init.sh[4]: message:参数未设置。

对于捕捉错别字非常有用

时间会改变一切。这是一个网站为shell脚本提供在线语法检查。

我发现它在检测常见错误方面非常强大。

enter image description here

关于ShellCheck

ShellCheck是一个用于sh/bash脚本的静态分析和检测工具。它主要关注处理典型的初级和中级级别的语法错误和陷阱,在这些错误中,shell只给出一个神秘的错误消息或奇怪的行为,但它也报告了一些更高级的问题,在这些问题中,极端情况可能导致延迟失败。

Haskell源代码可在GitHub!

Null命令[冒号]在调试查看变量值时也很有用

set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -

我实际上检查了当前目录下的所有bash脚本的语法错误,而没有使用find工具运行它们:

例子:

find . -name '*.sh' -print0 | xargs -0 -P"$(nproc)" -I{} bash -n "{}"

如果您想对单个文件使用它,只需编辑带有文件名的通配符。

如果你在一个变量中需要一个目录中所有文件的有效性(git pre-commit hook, build lint script),你可以在一个变量中捕获"sh -n"或"bash -n"命令的stderr输出(见其他答案),并基于此有一个" If /else"

bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \;  2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi

根据需要将“sh”改为“bash”

仅适用于验证语法:

shellcheck [programPath]

对于运行,程序只在语法通过时执行,因此同时调试语法和执行:

防弹的 [programPath]

如果您启用了语法检查,Bash shell脚本将运行语法检查

set -o noexec

如果你想关闭语法检查

set +o noexec