Shell脚本开发环境的配置和优化实践
1. 配置vim编辑器
1-1. 为什么不使用vi而是vim
- vi适合编辑普通文本,不适用编写脚本代码,例如:缺少高亮显示代码、自动缩进等重要功能;
- vim相当于高级编辑器,可以提高开发效率。
1-2. 设置vim为默认编辑器
[root@oldboy scripts]# echo 'alias vi=vim' >> /etc/bashrc
[root@oldboy scripts]# tail -1 /etc/bashrc
alias vi=vim
[root@oldboy scripts]# source /etc/bashrc
经过上述调整后,当用vi命令时,会自动被vim替换。
1-3. 配置.vimrc的重要参数
Linux环境下的vim编辑器默认功能不够强大,如果要进行Shell脚本的开发,还需要进行适当的设置,从而达到高效开发的目的。vim编辑器有一个可以用来调整配置的配置文件,默认放置在用户家目录下,全路径及名字组合为:~/.vimrc(全局路径为/etc/vimrc),这是一个隐藏文件。
~/.vimrc配置内容如下:
cat > ~/.vimrc << eof
" ~/.vimrc
" vim config file
" date 2018-07-15
" Created by oldboy
" blog:http://www.cnblogs.com/wushuaishuai
"""""""""""""""""""""
" => 全局配置
"""""""""""""""""""""
"关闭兼容模式
set nocompatible
"设置历史记录步数
set history=100
"开启相关插件
filetype on
filetype plugin on
filetype indent on
"当文件在外部被修改时,自动更新该文件
set autoread
"激活鼠标的使用
set mouse=a
"""""""""""""""""""""
" => 字体和颜色
"""""""""""""""""""""
"开启语法
syntax enable
"设置字体
"set guifont=dejaVu\ Sans\ MONO\ 10
"
""设置配色
"colorscheme desert
"高亮显示当前行
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00ff00
"""""""""""""""""""""
" => 代码折叠功能 by oldboy
"""""""""""""""""""""
"激活折叠功能
set foldenable
"设置按照语法方式折叠(可简写set fdm=XX)
"有6种折叠方法:
"manual 手工定义折叠
"indent 更多的缩进表示更高级别的折叠
"expr 用表达式来定义折叠
"syntax 用语法高亮来定义折叠
"diff 对没有更改的文本进行折叠
"marker 对文中的标志进行折叠
set foldmethod=manual
"设置折叠区域的宽度
"如果不为0,则在屏幕左侧显示一个折叠标识列
"分别用“-”和“+”来表示打开和关闭的折叠。
set foldcolumn=0
"设置折叠层数为3
setlocal foldlevel=3
"设置为自动关闭折叠
set foldclose=all
"用空格键来代替zo和zc快捷键实现开关折叠
"zo O-pen a fold (打开折叠)
"zc C-lose a fold (关闭折叠)
"zf F-old creation (创建折叠)
nnoremap <space> @=((foldclosed(line('.')) < 0) 'zc' : 'zo')<CR>
"""""""""""""""""""""
" => 文字处理 by oldboy
"""""""""""""""""""""
"使用空格来替换Tab
set expandtab
"设置所有的Tab和缩进为4个空格
set tabstop=4
"设定 << 和 >> 命令移动时的宽度为4
set shiftwidth=4
"使得按退格键时可以一次删掉4个空格
set softtabstop=4
set smarttab
"缩进,自动缩进(继承前一行的缩进)
"set autoindent命令关闭自动缩进,是下面配置的缩写。
"可使用autoindent命令的简写,即 “:set ai” 和 “:set noai”。
"还可以使用“ :set ai sw=4”在一个命令中打开缩进并设置缩进级别。
set ai
"智能缩进
set si
"自动换行
set wrap
"设置软宽度
set sw=4
"""""""""""""""""""""
" => Vim 界面 by oldboy
"""""""""""""""""""""
"Turn on WiLd menu
set wildmenu
"显示标尺
set ruler
"设置命令行的高度
set cmdheight=1
"显示行数
"set nu
"Do not redraw, when running macros.. lazyredraw
set lz
"设置退格
set backspace=eol,start,indent
"Bbackspace and cursor keys wrap to
set whichwrap+=<,>,h,l
"Set magic on(设置魔术)
set magic
"关闭遇到错误时的声音提示
"关闭错误信息响铃
set noerrorbells
"关闭使用可视响铃代替呼叫
set novisualbell
"显示匹配的括号([{和}])
set showmatch
"How many tenths of a second to blink
set mat=2
"搜索时高亮显示搜索到的内容
set hlsearch
"搜索时不区分大小写
"还可以使用简写(“:set ic” 和 “:set noic”)
set ignorecase
"""""""""""""""""""""
" => 编码设置
"""""""""""""""""""""
"设置编码
set encoding=utf-8
"设置文件编码
set fileencodings=utf-8
"设置终端编码
set termencoding=utf-8
"""""""""""""""""""""
" => 其他设置 by oldboy 2010
"""""""""""""""""""""
"开启新行时使用智能自动缩进
set smartindent
set cin
set showmatch
"隐藏工具栏
set guioptions-=T
"隐藏菜单栏
set guioptions-=m
"置空错误铃声的终端代码
set vb t_vb=
"显示状态栏 (默认值为 1, 表示无法显示状态栏)
set laststatus=2
"粘贴不换行问题的解决方法
set pastetoggle=<F9>
"设置背景色
set background=dark
"设置高亮相关
highlight Search ctermbg=black ctermfg=white guifg=white guibg=black
"在Shell脚本的开头自动增加解释器及作者等版权信息
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2, "# Author: Wu ShuaiShuai")
call setline(3, "# Blog2: http://www.cnblogs.com/wushuaishuai")
call setline(4, "# Time: ".strftime("%F %T"))
call setline(5, "# Name: ".expand("%"))
call setline(6, "# Version: v1.0")
call setline(7, "# Description: This is a Script.")
endif
endfunc
eof
退出重新登录后.vimrc生效,同样适用于普通用户。
1-4. vim路径等配置知识
相关配置文件 | 功能描述 |
---|---|
.viminfo | 用户使用vim的操作历史 |
.vimrc | 当前用户vim的配置文件 |
/etc/vimrc | 系统全局vim的配置文件 |
/usr/share/vim/vim74/colors/ | 配色模板文件存放路径 |
2. vim编辑器实战
2-1. 代码自动缩进功能
当输入循环及条件结构语句等代码时,系统会自动将输入语句的关键字及命令代码缩进到合理的位置,可以看到,vim的配置是以两个空格为缩进宽度(.vimrc里设置的)的。
2-2. 代码颜色高亮显示功能
代码颜色高亮显示也是一个非常好的功能,可以通过它区分字符、变量、循环等很多不同的Shell脚本元素。例如当编写的代码出现错误时,对应的代码高亮颜色就会和正确时的不同,开发者可以根据代码的高亮颜色对Shell脚本进行调试,提升编码的效率,减少编码的错误。
2-3. vim配置文件的自动增加版权功能
当执行“vim oldboy.sh”编辑脚本时,只要是以.sh为扩展名的,就会自动增加版权信息。
2-4. 显示当前行、显示光标的坐标位置
2-5. vim配置文件的代码折叠功能
在代码量较大时比较有用的高级功能——代码折叠(依赖.vimrc配置,当然也可以以命令模式执行)
- 在命令模式下,可以把光标定位到当前的第2行,然后执行zf3j命令,便可将第2行及其下的3行缩进,其他缩进也是如此。
- 若把光标放到对应折叠后的行上,按空格键即可展开上述折叠的行。
2-6. vim编辑器批量缩进及缩进调整技巧
有时我们从外部复制部分Shell代码到当前脚本后发现缩进是乱的。
-
此时可以将vim编辑器调整为命令模式(按Esc键),然后移动键盘上下键将光标定位到要调整的行开头。
-
接下来输入“v”(可视化缩写),然后用键盘移动光标选定要调整的多行。
-
最后按“=”键即可将代码调整为规整的格式。
2-7. vim编辑器块操作
2-7-1. 可视模式
进入可视模式有三种方法:v,V,Ctrl+v
- 按v(小写)启用可视模式,可以按单个字符选择内容,移动光标可以选择。
- 按V(大写)启用可视模式,立刻选中光标所在行,按单行符选择内容,移动光标可以选择。
- 按Ctrl+v启用可视中的列块模式,可以在列方向上选择单个字符,移动光标可以选择。
2-7-2. 列块(可视)模式
Ctrl+v,启用列块模式,之后移动鼠标,可以选中某一个矩形块,对于有规律的表格可以用这个功能。
目前当前光标所在的位置是右下角,可以在这个块的四角进行移动光标,方法就是按o(小写),O(大写)来切换四个顶点。
(1).删除或剪切操作
- Ctrl+v,进入列块模式,选中需要删除的内容
- 按d(小写)即可删除选中区域
- 按D(大写)删除选中区域及所在行后面的数据
(2).输入操作
- Ctrl+v,进入列块模式,选中需要添加的内容
- 按I(大写)进入插入,然后输入“//”(你想输入的字符)
- 然后按ESC即可在其它行输入你想输入的字符了
(3).复制和粘贴操作
- Ctrl+v,进入列块模式,选中需要复制的内容
- 按y(小写)复制内容,4 line yanked 说明复制了四行
- 然后移动光标到行首,按p(小写)在光标的后面一列输入内容,按P(大写)在光标前面一列输入内容
2-8. vim多窗口使用技巧
2-8-1. 打开多窗口
打开多窗口的命令以下几个:
横向切割窗口
:new+窗口名(保存后就是文件名)
:split+窗口名,也可以简写为:sp+窗口名
纵向切割窗口名
:vsplit+窗口名,也可以简写为:vsp+窗口名
2-8-2. 关闭多窗口
可以用:q!,也可以使用:close,最后一个窗口不能使用close关闭。使用close只是暂时关闭窗口,其内容还在缓存中,只有使用q!、w!或x才能真能退出。
:tabc 关闭当前窗口
:tabo 关闭所有窗口
2-8-3. 窗口切换
:ctrl+w+j/k,通过j/k可以上下切换,或者:ctrl+w加上下左右键,还可以通过快速双击ctrl+w依次切换窗口。
2-8-4. 窗口大小调整
纵向调整
:ctrl+w + 纵向扩大(行数增加)
:ctrl+w - 纵向缩小 (行数减少)
:res(ize) num 例如::res 5,显示行数调整为5行
:res(ize)+num 把当前窗口高度增加num行
:res(ize)-num 把当前窗口高度减少num行
横向调整
:vertical res(ize) num 指定当前窗口为num列
:vertical res(ize)+num 把当前窗口增加num列
:vertical res(ize)-num 把当前窗口减少num列
2-8-5. 给窗口重命名
:f file
2-8-6. vim打开多文件
vim a b c
:n 跳至下一个文件,也可以直接指定要跳的文件,如:n c,可以直接跳到c文件
:e# 回到刚才编辑的文件
2-8-7. 开启目录浏览器
:Ex 开启目录浏览器(可以浏览当前目录下的所有文件,并且可以选择)
:Vex 垂直分割窗当前窗口,并在一个窗口中开启目录浏览器
:Sex 水平分割当前窗口,并在一个窗口中开启目录浏览器
:ls 显示当前buffer情况
2-8-8. vim与shell切换
:shell 可以在不关闭vi的情况下切换到shell命令行
exit 从shell回到vim
2-9. vim常用操作快捷键
命令 | 说明 |
---|---|
普通模式:移动光标的操作 | |
G 或(shift+g) | 将光标移动到文件的最后一行 |
gg | 将光标移动到文件的第一行,等价于1gg 或1G |
数字0或^ | 将光标从所在位置移动到当前行的开头 |
$ | 从光标所在位置将光标移动到当前行的结尾 |
n+Enter键 | n 为数字,Enter键 为回车键,将光标从当前位置向下移动 n 行 |
ngg | n 为数字,移动到文件的第n 行,如11gg 可移动到第 11 行,可配合“:set nu ”查看,同nG |
H | 光标移动到当前窗口最上方的那一行 |
M | 光标移动到当前窗口中间的那一行 |
L | 光标移动到当前窗口最下方的那一行 |
h 或( ←) | 光标向左移动一个字符 |
j 或(↓) | 光标向下移动一个字符 |
k 或(↑) | 光标向上移动一个字符 |
l 或(→) | 光标向右移动一个字符 |
普通模式:搜索与替换操作 | |
/oldboy | 从光标位置开始,向下寻找名为oldboy 的字符串 |
?oldboy | 从光标位置开始,向上寻找名为oldboy 的字符串 |
n | 从光标位置开始,向下重复前一个搜索的的动作 |
N | 从光标位置开始,向上重复前一个搜索的的动作 |
:g/A/s//B/g | 把符合A 的内容全部替换为B ,斜线为分隔符,可以用@ 、# 等替代 |
:%s/A/B/g | 把符合A 的内容全部替换为B ,斜线为分隔符,可以用@ 、# 等替代 |
:n1,n2s/A/B/gc | n1 、n2 为数字,在第n1 行和n2 行间寻找A ,用B 替换 |
普通模式:复制、粘贴、删除等操作 | |
yy | 复制光标所在的当前行 |
nyy | n 为数字,复制光标开始向下共n 行 |
p/P | p 将已复制的数据粘贴到光标的下一行,P 则为粘贴到光标的上一行 |
dd | 删除光标所在的当前行 |
ndd | n 为数字,删除从光标开始向下共n 行 |
u | 恢复(回滚)前一个执行过操作 |
. | 点号。重复前一个执行过的动作 |
x | 向后删除字符 |
X | 向前删除字符 |
d1G | 删除当前行至第一行 |
dG | 删除当前行至最后一行 |
d0 | 删除当前光标文本至行首 |
d$ | 删除当前光标文本至行尾 |
进入编辑模式命令 | |
i | 在当前光标所在处插入文字 |
a | 在当前光标所在下一个字符处插入文字 |
I | 在当前所在行的行首第一个非空格符处开始插入文字,和 A 相反 |
A | 在当前所在行的行尾最后一个字符处开始插入文字,和 I 相反 |
O | 在当前所在行的上一行处插入新的一行 |
o | 在当前所在行的下一行处插入新的一行 |
Esc | 退出编辑模式,回到命令模式中 |
命令行模式 | |
:wq | 退出并保存 |
:wq! | 退出并强制保存,"!" 为强制的意思 |
:q! | 强制退出,不保存 |
:n1,n2 w filename | n1 、n2 为数字,将 n1 行到 n2 行的内容保存成 filename 这个文件 |
:n1,n2 co n3 | n1 、n2 为数字,将 n1 行到 n2 行的内容拷贝到 n3 位置下 |
:n1,n2 m n3 | n1 、n2 为数字,将 n1 行到 n2 行的内容挪至 n3 位置下 |
:!command | 暂时离开vi 到命令行模式下执行command 的显示结果!例如 :! ls /etc |
:set nu | 显示行号 |
:set nonu | 与 set nu 相反,取消行号 |
:vs filename | 垂直分屏显示,同时显示当前文件和 filename 对应文件的内容 |
:sp filename | 水平分屏显示,同时显示当前文件和 filename 对应文件的内容 |
I + # + Esc | 在可视块模式下(Ctrl + v ), 一次性注释所选的多行,取消注释可用:n1,n2s/#/ /gc |
Del | 在可视块模式下(Ctrl + v ),一次性删除所选内容 |
r | 在可视块模式下(Ctrl + v ),一次性替换所选内容 |
参考资料:《跟老男孩学Linux运维:Shell编程实战》