作者:大大炮 | 2023-09-04 14:19
是否可以检查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上运行.