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

时间:2008-10-05 12:51:25

标签: linux bash unix syntax gnu

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

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

9 个答案:

答案 0 :(得分:342)

bash -n scriptname

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

答案 1 :(得分:110)

时间会改变一切。 Here is a web site,提供shell脚本的在线语法检查。

我发现检测常见错误非常有用。

enter image description here

关于ShellCheck

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

Haskell源代码可在GitHub上获得!

答案 2 :(得分:37)

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

set -u 

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

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

运行脚本:

$ check_init.sh

将报告以下内容:

  

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

捕获拼写错误非常有用

答案 3 :(得分:22)

sh  -n   script-name 

运行它。如果脚本中存在任何语法错误,则会返回相同的错误消息。 如果没有错误,那么它会在没有给出任何消息的情况下出现。您可以使用echo $?立即检查,0会在没有任何错误的情况下返回{{1}}确认成功。

这对我有用。我在Linux OS,Bash Shell上运行。

答案 4 :(得分:4)

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

示例:

find . -name '*.sh' -exec bash -n {} \;

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

答案 5 :(得分:3)

null命令[冒号]在调试以查看变量值

时也很有用
set -x
for i in {1..10}; do
    let i=i+1
    : i=$i
done
set - 

答案 6 :(得分:1)

答案 7 :(得分:1)

仅用于验证语法:

<块引用>

shellcheck [程序路径]

对于运行程序只有在语法通过时,所以调试语法和执行:

<块引用>

shellproof [程序路径]

答案 8 :(得分:0)

如果您需要变量中目录中所有文件的有效性(git pre-commit hook,build 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”