当前位置: 首页 > 科技观察

有了这个神器,再也不怕shell写错了

时间:2023-03-19 01:24:55 科技观察

写过shell脚本的都知道,哪怕是一些简单的语法错误,运行起来也不一定能发现。一些看似运行正确的脚本,在某些分支和场景下,实际上可能还是有错误,一些写法可能运行正常,但不符合POSIX标准,不可移植。的确,shell脚本是解释运行的,没有办法像C/C++那样严格检查,但是我们还是可以借助一些工具来帮助我们提前发现一些错误。shellcheckshellcheck就是这样一个工具。可用于多种场景,包括在线、命令行检查、编辑器配置等,下面一一介绍。在线使用顾名思义,它提供了一个在线检查地址,https://www.shellcheck.net/,输入网址即可使用。例如,您输入脚本内容:#!/bin/shfornin{1..$RANDOM}dostr=""if((n%3==0))thenstr="fizz"fiif[$[n%5]==0]thenstr="$strbuzz"fiif[[!$str]]thenstr="$n"fiecho"$str"doneshell会给出错误提示或建议:Line2:fornin{1..$RANDOM}^--SC2039:InPOSIXsh,braceexpansionisundefined.^--SC2039:InPOSIXsh,RANDOMisundefined.Line5:if((n%3==0))^--SC2039:InPOSIXsh,standalone((..))isundefined.Line9:if[$[n%5]==0]^--SC2039:在POSIXsh中,$[..]代替$((..))未定义。^--SC2007:使用$((..))代替弃用的$[..]^--SC2039:InPOSIXsh,==inplaceof=isundefined.Line11:str="$strbuzz"^--SC2154:strbuzzisreferencedbutnotassigned.Line13:if[[!$str]]^--SC2039:InPOSIXsh,[[]]未定义.这个怎么样?是不是很厉害?提示每个可能的错误。当新手shell出现莫名其妙的错误时,可以尝试使用ao。当然,很多例子并不是真的错了,只是某种写法不符合POSIX标准,这种情况也是应该避免的。shell的基本内容也可以参考《shell必备基础知识》。使用命令行安装也很简单(记得要用root权限),ubuntu下:$apt-getinstallshellcheckcentos:$yum-yinstallel-releaseFedora:$dnfinstallShellCheck使用起来也很简单:$shellcheckmyscript.sh例如,下面的写法是新手最容易出错的地方之一://来源:公众号【编程珠玑】//作者:守望先生#!/bin/bashif[$#-eq0]thenecho"nopara"elseecho"$#para"fiexit0查看运行错误:./test.sh:line4:if[0-eq0]:commandnotfound./test.sh:line5:syntaxerrornearunexpectedtoken`then'./test.sh:line5:`then'只是告诉你在Thereisagrammaticalproblemnearthen,问题是什么?我们用shellcheck看看:$shellchecktest.shIntest.shline4:if[$#-eq0]^--SC1069:Youneedaspacebeforethe[.这样一看,很明显[.前面少了一个空格。当然你也可以安装到你熟悉的编辑器中。虽然它们都有语法高亮功能,但是没有直接的信息提示。安装shellcheck工具,实现写字时提示的效果。Emacs,你可以使用Flycheck。崇高,你可以使用SublimeLinter。Atom,你可以使用Linter。vim,你可以用ale或者syntastic当然现代的IDE很多都有这样的检查功能,这里只说编辑器。这里我们以syntastic为例。事实上,它支持多种语言的语法检查。安装过程:1、安装pathogen.vim$mkdir-p~/.vim/autoload~/.vim/bundle&&\c??url-LSso~/.vim/autoload/pathogen.vimhttps://tpo.pe/pathogen.vim和在vimrc文件中配置如下内容:executepathogen#infect()2。安装安装syntasticcd~/.vim/bundle&&\gitclone--depth=1https://github.com/vim-syntastic/syntastic.git3。测试安装情况打开vim,输入以下内容:Helptags如果没有报错,说明安装正常。在vimrc中配置如下:setstatusline+=%#warningmsg#setstatusline+=%{SyntasticStatuslineFlag()}setstatusline+=%*letg:syntastic_always_populate_loc_list=1letg:syntastic_auto_loc_list=1letg:syntastic_check_on_open=1commonlyused::Errorsshowerrorpanel:lnexttonextError:lprevious上一个错误。更多安装细节请参考https://github.com/vim-syntastic/syntastic。以上是官网推荐的安装方式。也可以通过添加:Plugin'scrooloose/syntastic'openviminput::PluginInstall安装Vundle(这是老牌的插件管理方式,可以试试vim-plug等其他插件管理工具),具体的安装方法可以参考《vim完整开发环境配置--老旧版》。使用效果:shell检查:C语言语法检查:其实可以支持几乎所有常见编程语言的语法检查。详情可以看这里https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt不知道vimrc文件在哪里?打开vim,输入::version可以看到:"$VIM/gvimrc"usergvimrcfile:"$HOME/.gvimrc"2ndusergvimrcfile:"~/.vim/gvimrc"systemmenufile:"$VIMRUNTIME/menu.vim"它们的区别在于作用范围不同。对于用户的vimrc,自然只对特定用户有效。综上所述,工欲善其事,必先利其器。如果你有一个好的工具,你应该自然地使用它。欢迎分享更多方法或工具。