作者:守望,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写得不对了相关推荐

  1. oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...

    本文主要向大家介绍了Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 环境描述: 操作系统:Red  ...

  2. Linux运维面试中常被问到的两个shell脚本

    脚本一: 在公司里有一个网段是 192.168.3.0的网段,现在想判断一下哪些主机在线,哪些主机不在线. shell脚本解决方案: 方法一: 思路 首先要循环目标主机的IP地址,IP地址分为两部分: ...

  3. Linux运维简历模板技术储备(by ob)

    总结学过的知识点: Linux启动过程,NFS原理,RSYNC,LVS模式原理,MYSOL主从同步原理,及故障了如何解决.还有备份恢复的方案.监控报警等. Linux基础指令 整理后 =分割线= 简历 ...

  4. linux运维高薪就业指导(新手获得高薪必备)

    老男孩linux运维高薪就业指导 超细精讲 15年专家经验,新手获得高新必备课程 http://edu.51cto.com/course/course_id-3708.html 本课程2015年5月2 ...

  5. 第13章代码《跟老男孩学习Linux运维:Shell编程实战》

    本书历史上已出版最实战的Shell高级编程实战书籍,没有之一,和市面书籍不同,本书是作者经过18年的运维工作及教学工作后,创新类企业级实战书籍,适合所有学习及从事Linux相关工作的读者. <跟 ...

  6. linux 运维高级脚本生成器,Linux运维系列,Shell高级脚本自动化编程实战

    课程文件目录: Linux自动化运维系列 Shell高级脚本自动化编程实战 [6.1G] ┣━━01.Shell基础概述 [315.1M] ┃ ┣━━1-1 Shell脚本体系概述.mp4 [154. ...

  7. 合格linux运维人员必会的30道shell编程面试题及讲解

    超深度讲解shell高级编程实战,截至目前shell编程课程国内培训机构最细的课程,不信请看学员表现的水平. 课程牛不牛,不是看老师.课表,而是看培养的的学生水平,目前全免费中伙伴们赶紧看啊. htt ...

  8. linux上安装shell编辑器与linux运维面试题

    分两个部分 一.安装B-shell解释器 安装cygwin  Eclipse要找到安装的bin路径 https://cygwin.com 二.安装编辑器shellEd 下载可以得到一个:net.sou ...

  9. linux运维脚本编写,最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本...

    最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本 大家可以通过参考下面的课程学习目录,就会发现单单只从目录上来分析就知道这是一部非常系统的Shell自动化脚本运 ...

最新文章

  1. Ajax学习-Ajax简介
  2. AT1350 深さ優先探索(洛谷 深度优先搜索+记忆化)
  3. Mongoose 索引、Mongoose 内置 CURD 方 法、扩展 Mongoose Model 的静态方法和 实例方法
  4. ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波
  5. 加载慢_解决游戏加载慢不必大刀阔斧升改,教你一个简单有效的方法
  6. 铁路部门调整车票预售期为15天 火车票今年不再“一票难求”
  7. ASP.NET-第五天-HTML基础
  8. 代码调试之-单步调试问题
  9. verilog求倒数-ROM实现方法
  10. Linux 下 svn 恢复到指定版本
  11. Lightbox插件
  12. H5常用代码:页面框架
  13. 南京商品房信息在哪里查询(查备案价)
  14. RocketMQ独孤九剑-总纲
  15. Re:从0开始的微服务架构:(一)重识微服务架构
  16. Android 解决TextView排版参差不齐的问题
  17. ios微信一直显示未连接到服务器,关于微信分享显示“正在连接”,“未验证应用”以及未正确加载apple-app-site-association配置文件问题说明...
  18. mysql5.1.40.jrp_1.原生态JDBC编程中的问题总结
  19. 【JavaSE】《基础篇005》集合
  20. javase哪部分最难_关于javase的一些个人理解

热门文章

  1. win10安装mysql无服务_win10装sql没有SQL Server 服务
  2. Spring Boot 2.6.1 发布:为 Spring Cloud 2021铺路!
  3. 国内首个比特币勒索病毒制作者落网,但过程有点好笑...
  4. 最最最全面的Java异常面试及解答
  5. 使用Druid数据源时候这个问题碰到过没:connection holder is null
  6. IntelliJ IDEA 2019.2最新解读:性能更好,体验更优,细节处理更完美!
  7. 死磕Java并发:J.U.C之并发工具类:CyclicBarrier
  8. arcface mxnet转onnx
  9. No module named ‘sklearn.utils.linear_assignment_‘
  10. pycharm 转大写