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

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


当前回答

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

例子:

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

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

其他回答

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

例子:

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

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

bash -n scriptname

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

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

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

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

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

set -o noexec

如果你想关闭语法检查

set +o noexec