[英]How do I syntax check a Bash script without running it?
是否可以在不执行的情况下检查 bash 脚本语法?
使用 Perl,我可以运行perl -c 'script name'
。 bash 脚本是否有任何等效的命令?
bash -n scriptname
也许一个明显的警告:这会验证语法,但不会检查您的 bash 脚本是否尝试执行不在您的路径中的命令,例如ech hello
而不是echo hello
。
时间会改变一切。 这是一个为 shell 脚本提供在线语法检查的网站。
我发现它在检测常见错误方面非常强大。
ShellCheck是一个用于 sh/bash 脚本的静态分析和 linting 工具。 它主要专注于处理典型的初级和中级语法错误和陷阱,其中 shell 只是给出一个神秘的错误消息或奇怪的行为,但它也报告了一些更高级的问题,这些问题可能导致延迟失败。
Haskell 源代码在 GitHub 上可用!
我还在我编写的每个 bash 脚本上启用了 'u' 选项,以便进行一些额外的检查:
set -u
这将报告未初始化变量的使用情况,如以下脚本“check_init.sh”
#!/bin/sh
set -u
message=hello
echo $mesage
运行脚本:
$ check_init.sh
将报告以下内容:
./check_init.sh[4]: 消息:未设置参数。
非常有用的捕捉错别字
sh -n script-name
运行这个。 如果脚本中有任何语法错误,则返回相同的错误消息。 如果没有错误,那么它会在不给出任何消息的情况下出现。 您可以立即使用echo $?
, 将返回0
确认成功,没有任何错误。
它对我很有效。 我在 Linux 操作系统、Bash Shell 上运行。
我实际上检查了当前目录中的所有 bash 脚本是否存在语法错误,而没有使用find
工具运行它们:
例子:
find . -name '*.sh' -print0 | xargs -0 -P"$(nproc)" -I{} bash -n "{}"
如果要将它用于单个文件,只需编辑带有文件名的通配符。
null 命令 [colon] 在调试以查看变量值时也很有用
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
IntelliJ IDEA有BashSupport 插件可以检查语法。
如果您需要在一个变量中确定目录中所有文件的有效性(git pre-commit hook,构建 lint 脚本),您可以捕获“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”
如果您启用语法检查,Bash shell 脚本将运行 Synatx 检查
set -o noexec
如果你想关闭语法检查
set +o noexec
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.