当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在不运行Bash脚本的情况下语法检查?》经验,为你挑选了4个好方法。

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

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



1> andy..:
bash -n scriptname

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


添加到(对我来说)非显而易见的警告,它也不会捕获由缺少空格引起的错误`if ["$ var"=="string"]`而不是`if ["$ var"== "string"]`
@Brynjar那是因为它只是语法检查.open括号不是语法,这是要运行的函数的名称.`type [`说"[是一个内置的shell".它最终委托给`test`程序,但它也希望有一个结束括号.所以它就像`if test"$ var"`,这不是作者的意思,但在语法上是有效的(假设$ var的值为"a",那么我们将看到"bash:testa:command not found" ).从语法上讲,没有遗漏空间.
在bash的联机帮助页中,在"SHELL BUILTIN COMMANDS/set"下,记录了-n,并且作为联机帮助页的开头,bash解释了`set`所做的所有单字符选项.
@JoshuaCheek:在这种情况下,如果`$ var`恰好扩展为_empty string_,则只调用```.如果`$ var`扩展为_non-empty_字符串,`[`是带有该字符串的_concatenated_并被Bash解释为_command_ name(不是_function_ name),是的,这是_syntactically_有效,但是,当你说,显然不是意图.如果你使用`[[`而不是`[`,即使`[[`是shell _keyword_(而不是内置)),你也会得到相同的结果,因为非预期的字符串连接仍然会覆盖对关键字的识别.
@JoshuaCheek:Bash仍在_syntax_-检查:它正在检查_simple-command invocation_语法:`["$ var"`是_syntactically_一个有效的_command-name_表达式; 类似地,令牌`==`和`'$ string"`是有效的命令_arguments_.(通常,内置`[`用_command_语法解析,而`[[` - 作为shell _keyword_ - 被解析不同.)shell内置````_not_ _delegate_到``test` program"(外部工具) :`bash`,`dash`,`ksh`,`zsh`都有`[`和`test`的_builtin_版本,并且它们不会调用它们的外部实用程序对应物.
底线是:只使用Bash本身,`-n`是你最好的选择,但这不会发现初学者可能犯的很多错误; 要抓住这些,请使用http://shellcheck.net或其CLI,详见[dvd818的答案](http://stackoverflow.com/a/19573083/45375).

2> 小智..:

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

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

在此输入图像描述

关于ShellCheck

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

Haskell源代码可在GitHub上获得!


很棒的提示; 在OSX上你现在也可以通过[Homebrew](http://brew.sh)安装shellcheck.net CLI,`shellcheck`:`brew install shellcheck`.
还有debian和朋友:`apt-get install shellcheck`

3> Diego Tercer..:

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

set -u 

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

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

运行脚本:

$ check_init.sh

将报告以下内容:

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

捕捉拼写错误非常有用


我总是在我的bash脚本中设置这些标志,如果它通过这些,最好去"set -o errexit""set -o nounset""set -o pipefail"

4> 小智..:
sh  -n   script-name 

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

它对我有用.我在Linux OS,Bash Shell上运行.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有