如何在不执行脚本的情况下检查bash脚本的语法是否正确?
使用Perl,可以运行 perl -c '脚本名称'
命令。是否有类似于Bash脚本的等效命令?
bash -n scriptname
也许一个显而易见的警告:这个工具可以验证语法,但不检查您的bash脚本是否尝试执行不在您路径中的命令,例如ech hello
而不是echo hello
。
set
所有单字符选项。 - ephemientif ["$var" == "string" ]
而不是 if [ "$var" == "string" ]
。请注意,翻译保持原义,通俗易懂。 - Brynjar说:“[ 是一个Shell内置”。它最终委托给'test'程序,但它也期望有一个闭合的括号。所以这就像
if test"$var"`,这不是作者想表达的意思,但在语法上是有效的(假设$var的值为“a”,那么我们将看到“bash:testa: command not found”)。关键是从语法上讲,没有缺少空格。 - Joshua Cheek["$var"
在语法上是一个有效的命令名称表达式;同样,标记 ==
和 "$string"
是有效的命令参数。通常情况下,内置的 [
会被解析为命令语法,而作为 shell 关键字的 [[
则有不同的解析方式。Shell 内置的 [
不会委托给“test 程序”(外部实用程序):bash
、dash
、ksh
、zsh
都有 [
和 test
的内置版本,并且它们不会调用其外部实用程序对应物。 - mklement0-n
是最好的选择,但这不会捕获初学者可能会犯的许多错误;为了捕获这些错误,请使用http://shellcheck.net或其CLI,如[dvd818的答案](https://dev59.com/y3VC5IYBdhLWcg3w1Exq#19573083)中所述。 - mklement0时间改变一切。 这个网站 提供在线的 shell 脚本语法检查,我觉得它可以很好地检测常见错误。
ShellCheck 是一个用于 sh/bash 脚本的静态分析和 lint 工具。它主要关注处理初学者和中级水平语法错误和陷阱,其中 shell 只会给出晦涩难懂的错误消息或奇怪的行为,但它还报告了一些更高级的问题,其中边角情况可能导致延迟故障。
ShellCheck 的 Haskell 源代码可在 GitHub 上找到!
shellcheck
:brew install shellcheck
。 - mklement0apt-get install shellcheck
。该命令的作用是安装ShellCheck工具。 - that other guy为了进行一些额外的检查,我也会在编写的每个bash脚本中启用'u'选项:
set -u
这将报告未初始化变量的使用情况,就像在以下脚本“check_init.sh”中一样。
#!/bin/sh
set -u
message=hello
echo $mesage
运行脚本:
$ check_init.sh
将报告以下内容:
./check_init.sh[4]: mesage: 参数未设置。
非常有用,可以捕捉拼写错误。
set -u
,虽然这并没有真正回答问题,因为您必须运行脚本才能获取错误消息。即使是 bash -n check_init.sh
也不会显示该警告。 - rubo77sh -n script-name
运行此脚本。如果脚本中存在语法错误,则返回相同的错误消息。
如果没有错误,则不会给出任何消息。您可以使用echo $?
立即检查,它将返回0
,证实成功且没有错误。
这对我很有效。我在Linux操作系统、Bash Shell上运行。
sh -n
可能不会检查脚本是否是有效的 Bash 脚本。它可能会给出错误的负面结果。sh
是一些 Bourne shell 变体,通常不是 Bash。例如,在 Ubuntu Linux 中,realpath -e $(command -v sh)
给出 /bin/dash。 - jarno我实际上使用 find
工具来检查当前目录中所有 Bash 脚本的语法错误,而不运行它们:
例如:
find . -name '*.sh' -print0 | xargs -0 -P"$(nproc)" -I{} bash -n "{}"
如果您只想用于单个文件,请将通配符更改为文件名。
在调试时,null命令[冒号]也非常有用,可以查看变量的值。
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
set -x
会在每行执行之前显示它。 - rubo77Bash shell脚本将运行语法检查,如果您启用了语法检查,则会进行检查。
set -o noexec
如果你想关闭语法检查
set +o noexec
有一个针对IntelliJ IDEA的BashSupport插件,可以检查语法。
.sh
或其他与Bash脚本相关的扩展名结尾,则它将无法正常工作,如果您使用某些模板工具(例如ERB)生成脚本,则会出现这种情况(然后它们以.erb
结尾)。如果您希望修复此问题,请为https://youtrack.jetbrains.com/issue/IDEA-79574投票! - Greg DubickibashErrLines=$(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
根据您的需要,使用“bash”替换“sh”