301

是否可以在不执行的情况下检查 bash 脚本语法?

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

4

10 回答 10

425
bash -n scriptname

也许一个明显的警告:这会验证语法,但不会检查您的 bash 脚本是否尝试执行不在您的路径中的命令,例如ech hello代替echo hello.

于 2008-10-05T12:55:00.523 回答
144

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

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

在此处输入图像描述

关于壳牌检查

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

Haskell 源代码在 GitHub 上可用!

于 2013-10-24T17:55:18.517 回答
39

我还在我编写的每个 bash 脚本上启用了“u”选项,以便进行一些额外的检查:

set -u 

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

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

运行脚本:

$ check_init.sh

将报告以下内容:

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

捕捉错别字非常有用

于 2012-05-23T14:10:30.973 回答
26
sh  -n   script-name 

运行这个。如果脚本中有任何语法错误,那么它会返回相同的错误消息。如果没有错误,那么它就会出现而不给出任何消息。您可以立即使用 进行检查echo $?,它将返回0确认成功,没有任何错误。

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

于 2011-02-02T13:16:05.993 回答
6

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

例子:

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

如果要将其用于单个文件,只需使用文件名编辑通配符。

于 2017-08-03T11:58:06.250 回答
3

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

set -x
for i in {1..10}; do
    let i=i+1
    : i=$i
done
set - 
于 2014-01-17T10:41:34.497 回答
2

IntelliJ IDEABashSupport 插件可以检查语法。

于 2015-12-05T18:17:21.730 回答
2

仅用于验证语法:

shellcheck [程序路径]

仅当语法通过时才运行程序,因此调试语法和执行:

防壳[programPath]

于 2021-02-13T01:52:48.527 回答
1

如果你需要一个变量中所有文件在一个目录中的有效性(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”

于 2019-07-16T09:17:48.693 回答
1

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

set -o noexec

如果你想关闭语法检查

set +o noexec
于 2021-08-30T03:28:59.667 回答