linux运shell 出现commond vim_有了这个神器,再也不怕shell写得不对了
作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。
写过shell脚本的人都知道,即便出现一些简单的语法错误,运行的时候也可能没有办法发现。有些看似运行正确的脚本,实际上可能在某些分支,某些场景下仍然出现错误,而有的写法可能运行正常,但是却不符合POSIX标准,不具备可移植性。
诚然,shell脚本是解释运行,没有办法向C/C++那样严格检查,但是我们仍然可以借助一些工具帮助我们提前发现一些错误。
shellcheck
shellcheck就是这样的一个工具。它可以在多种场景下使用,包括在线,命令行检查,编辑器配置,下面逐一介绍。
在线使用
顾名思义,它提供了一个在线的检查地址,https://www.shellcheck.net/,进入网址即可使用。
例如,你输入你的脚本内容:
#!/bin/shfor n in {1..$RANDOM}do str="" if (( n % 3 == 0 )) then str="fizz" fi if [ $[n%5] == 0 ] then str="$strbuzz" fi if [[ ! $str ]] then str="$n" fi echo "$str"done
shell
它会给出错误提示或者建议:
Line 2:for n in {1..$RANDOM} ^-- SC2039: In POSIX sh, brace expansion is undefined. ^-- SC2039: In POSIX sh, RANDOM is undefined.
Line 5: if (( n % 3 == 0 )) ^-- SC2039: In POSIX sh, standalone ((..)) is undefined.
Line 9: if [ $[n%5] == 0 ] ^-- SC2039: In POSIX sh, $[..] in place of $((..)) is undefined. ^-- SC2007: Use $((..)) instead of deprecated $[..] ^-- SC2039: In POSIX sh, == in place of = is undefined.
Line 11: str="$strbuzz" ^-- SC2154: strbuzz is referenced but not assigned.
Line 13: if [[ ! $str ]] ^-- SC2039: In POSIX sh, [[ ]] is undefined.
怎么样,是不是很给力,每个可能的错误都提示了。新手写shell出现莫名的报错时,可以尝试使用奥。当然例子中很多并不是真的错误,而是某种写法不符合POSIX标准,这种情况也应该避免。
关于shell的基本内容,也可以参考《shell必备基础知识》。
命令行使用
命令行安装也很简单(记得使用root权限),ubuntu下:
$ apt-get install shellcheck
centos下:
$ yum -y install epel-release
Fedora下:
$ dnf install ShellCheck
使用方法也很简单了:
$ shellcheck myscript.sh
举个例子,下面的写法是新手最容易出错的地方之一:
//来源:公众号【编程珠玑】//作者:守望先生#!/bin/bashif[ $# -eq 0 ]then echo "no para"else echo "$# para"fiexit 0
看运行报错:
./test.sh: line 4: if[ 0 -eq 0 ]: command not found./test.sh: line 5: syntax error near unexpected token `then'./test.sh: line 5: `then'
只是告诉你在then附近有语法问题,到底什么问题呢?我们用shellcheck看看:
$ shellcheck test.shIn test.sh line 4:if[ $# -eq 0 ] ^-- SC1069: You need a space before the [.
这么一看,就很清楚了,原来[前面少了空格。
编辑器中使用
当然也可以把它安装到你熟悉的编辑器中,虽然它们本身都有语法高亮的功能,但是并没有直接的信息提示,安装shellcheck类工具,达到编写即提示的效果。
Emacs, 可以使用 Flycheck.
Sublime,可以使用 SublimeLinter.
Atom,可以使用 Linter.
vim ,可以使用ale或者syntastic
当然了,现代很多IDE都有这样检查功能,这里只说编辑器。
这里以syntastic为例,实际上它支持多种语言的语法检查。
安装过程:
1.安装pathogen.vim
$ mkdir -p ~/.vim/autoload ~/.vim/bundle && \curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
并且在vimrc文件中配置以下内容:
execute pathogen#infect()
2.安装 Install syntastic
cd ~/.vim/bundle && \git clone --depth=1 https://github.com/vim-syntastic/syntastic.git
3.测试安装情况
打开vim,输入以下内容
:Helptags
如果没有报错,说明安装正常。
在vimrc中配置以下内容:
set statusline+=%#warningmsg#set statusline+=%{SyntasticStatuslineFlag()}set statusline+=%*
let g:syntastic_always_populate_loc_list = 1let g:syntastic_auto_loc_list = 1let g:syntastic_check_on_open = 1
常用:
:Errors 显示错误面板:lnext 到下一个错误:lprevious 到上一个错误
更多安装详情也可以参考https://github.com/vim-syntastic/syntastic。
以上是官网推荐的安装方式,也可以在安装了Vundle(这是一种老旧的插件管理方式,你可以尝试vim-plug等其他插件管理工具)的前提下,通过在配置文件中加入:
Plugin 'scrooloose/syntastic'
打开vim输入:
:PluginInstall
即可安装。
,具体安装方式可以参考《vim完整开发环境配置--老旧版》。
使用效果:
shell检查:
C语言语法检查:
实际上它可以支持几乎所有常见编程语言的语法检查。
具体可以查看这里https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt
不知道vimrc文件在哪里?
打开vim,输入:
:version
就可以看到啦:
system vimrc file: "$VIM/vimrc" user vimrc file: "$HOME/.vimrc" 2nd user vimrc file: "~/.vim/vimrc" user exrc file: "$HOME/.exrc" system gvimrc file: "$VIM/gvimrc" user gvimrc file: "$HOME/.gvimrc"2nd user gvimrc file: "~/.vim/gvimrc" system menu file: "$VIMRUNTIME/menu.vim"
它们区别在于生效范围不一样,对于用户的vimrc,自然只是对特定用户生效。
总结
工欲善其事必先利其器,有好的工具,自然就该用起来。欢迎分享更多的方法或工具。
●编号1061,输入编号直达本文
●输入m获取文章目录
推荐↓↓↓
运维
更多推荐《25个技术类公众微信》
涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。
linux运shell 出现commond vim_有了这个神器,再也不怕shell写得不对了相关推荐
- oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...
本文主要向大家介绍了Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 环境描述: 操作系统:Red ...
- Linux运维面试中常被问到的两个shell脚本
脚本一: 在公司里有一个网段是 192.168.3.0的网段,现在想判断一下哪些主机在线,哪些主机不在线. shell脚本解决方案: 方法一: 思路 首先要循环目标主机的IP地址,IP地址分为两部分: ...
- Linux运维简历模板技术储备(by ob)
总结学过的知识点: Linux启动过程,NFS原理,RSYNC,LVS模式原理,MYSOL主从同步原理,及故障了如何解决.还有备份恢复的方案.监控报警等. Linux基础指令 整理后 =分割线= 简历 ...
- linux运维高薪就业指导(新手获得高薪必备)
老男孩linux运维高薪就业指导 超细精讲 15年专家经验,新手获得高新必备课程 http://edu.51cto.com/course/course_id-3708.html 本课程2015年5月2 ...
- 第13章代码《跟老男孩学习Linux运维:Shell编程实战》
本书历史上已出版最实战的Shell高级编程实战书籍,没有之一,和市面书籍不同,本书是作者经过18年的运维工作及教学工作后,创新类企业级实战书籍,适合所有学习及从事Linux相关工作的读者. <跟 ...
- linux 运维高级脚本生成器,Linux运维系列,Shell高级脚本自动化编程实战
课程文件目录: Linux自动化运维系列 Shell高级脚本自动化编程实战 [6.1G] ┣━━01.Shell基础概述 [315.1M] ┃ ┣━━1-1 Shell脚本体系概述.mp4 [154. ...
- 合格linux运维人员必会的30道shell编程面试题及讲解
超深度讲解shell高级编程实战,截至目前shell编程课程国内培训机构最细的课程,不信请看学员表现的水平. 课程牛不牛,不是看老师.课表,而是看培养的的学生水平,目前全免费中伙伴们赶紧看啊. htt ...
- linux上安装shell编辑器与linux运维面试题
分两个部分 一.安装B-shell解释器 安装cygwin Eclipse要找到安装的bin路径 https://cygwin.com 二.安装编辑器shellEd 下载可以得到一个:net.sou ...
- linux运维脚本编写,最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本...
最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本 大家可以通过参考下面的课程学习目录,就会发现单单只从目录上来分析就知道这是一部非常系统的Shell自动化脚本运 ...
最新文章
- Ajax学习-Ajax简介
- AT1350 深さ優先探索(洛谷 深度优先搜索+记忆化)
- Mongoose 索引、Mongoose 内置 CURD 方 法、扩展 Mongoose Model 的静态方法和 实例方法
- ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波
- 加载慢_解决游戏加载慢不必大刀阔斧升改,教你一个简单有效的方法
- 铁路部门调整车票预售期为15天 火车票今年不再“一票难求”
- ASP.NET-第五天-HTML基础
- 代码调试之-单步调试问题
- verilog求倒数-ROM实现方法
- Linux 下 svn 恢复到指定版本
- Lightbox插件
- H5常用代码:页面框架
- 南京商品房信息在哪里查询(查备案价)
- RocketMQ独孤九剑-总纲
- Re:从0开始的微服务架构:(一)重识微服务架构
- Android 解决TextView排版参差不齐的问题
- ios微信一直显示未连接到服务器,关于微信分享显示“正在连接”,“未验证应用”以及未正确加载apple-app-site-association配置文件问题说明...
- mysql5.1.40.jrp_1.原生态JDBC编程中的问题总结
- 【JavaSE】《基础篇005》集合
- javase哪部分最难_关于javase的一些个人理解
热门文章
- win10安装mysql无服务_win10装sql没有SQL Server 服务
- Spring Boot 2.6.1 发布:为 Spring Cloud 2021铺路!
- 国内首个比特币勒索病毒制作者落网,但过程有点好笑...
- 最最最全面的Java异常面试及解答
- 使用Druid数据源时候这个问题碰到过没:connection holder is null
- IntelliJ IDEA 2019.2最新解读:性能更好,体验更优,细节处理更完美!
- 死磕Java并发:J.U.C之并发工具类:CyclicBarrier
- arcface mxnet转onnx
- No module named ‘sklearn.utils.linear_assignment_‘
- pycharm 转大写