Shell入门-Shell的组成及Vim配置
Shell入门
本篇包含的内容:
- Shell脚本的组成之解释器
- Shell脚本的执行
- Shell脚本的开发规范和习惯
- Vim的配置
先看一个基础的Shell脚本的内容:
[root@localhost shell]# cat tl.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo.com
#Version: 1.0
#Date: 2021-03-05
#FileName: tl.sh
#Description: This is a test script.
#***********************************************
[ $# -ne 2 ] && {
echo "must two args"
exit 1
}
脚本的内容可以看作三个部分,第一行的#!/bin/bash
表示解释器,之后7行都是注释信息包括了作者信息和创建日期等等,在注释信息之后就是脚本命令了。
解释器#!/bin/bash和#!/bin/sh
1.在shell脚本的第一行会有#!/bin/bash或#!/bin/sh,开头的#!表示幻数,在执行bash脚本的时候,内核会根据#!后的解释器来确定使用哪个程序解释脚本中的内容。
#!/bin/bash和#!/bin/sh
不位于shell脚本开头时,则被视为注释行。
2.bash和sh的区别
sh为bash的软链接,大多数情况下,脚本的开头使用“#! /bin/bash”和“#! /bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#! /bin/bash”。
[root@localhost shell]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 8月 10 2020 /bin/sh -> bash
[root@localhost shell]# ll /bin/bash
-rwxr-xr-x. 1 root root 964536 4月 1 2020 /bin/bash
[root@localhost shell]#
3.系统及bash的信息
[root@localhost shell]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@localhost shell]# bash --version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
4.shell中的注释尽量不要用中文,在脚本中最好也不要有中文。
Shell脚本的执行
Shell脚本执行的几种方式,以test.sh为例
bash test.sh
和sh test.sh
最常用,他们适用于①脚本无可执行类型权限②脚本文件开头没有指定解释器./test.sh
需要脚本有可执行权限,添加可执行权限命令chmod -x tset.sh
source test.sh
或. test.sh
,通过source或“.”加载执行过的脚本,由于是在当前Shell中执行脚本,因此在脚本结束之后,脚本中的变量(包括函数)值在当前Shell中依然存在,而sh和bash执行脚本都会启动新的子Shell执行,执行完后退回到父Shell。因此,变量(包括函数)值等无法保留
1.当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在加载了上述环境变量文件后,Shell就开始执行Shell脚本中的内容。
2.Shell脚本是从上至下、从左至右依次执行每一行的命令及语句的,如果在Shell脚本中遇到子脚本(即脚本嵌套)时,就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。
3.设置Linux的crond任务时,最好能在定时任务脚本中重新定义系统环境变量,否则,一些系统环境变量将不会被加载,这个问题需要注意!
Shell脚本开发的基本规范及习惯
开发规范:
- Shell脚本第一行指定脚本解释器
- Shell脚本开头会添加版本、版权等信息
- 在Shell脚本中尽量不用中文(不限于注释)。尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。如果非要加中文,请根据自身的客户端对系统进行字符集调整,如:export LANG="zh_CN.UTF-8",并在脚本中,重新定义字符集设置,和系统保持一致。
- Shell脚本的命名应该以.sh为扩展名
- Shell脚本应存放在固定的路径下
良好习惯:
- 成对的符号,一次性写出来,防止遗漏
- 中括号[]的两端至少有一个空格
- 流程控制语句,应一次性将格式写完,再添加内容
- 对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,需要强引用的(指所见即所得的字符引用),则用单引号(' '),如果是命令的引用,则用反引号(
OLDBOY_FILE="test.txt"
vim编辑器配置
[root@localhost etc]# cat vimrc
"""""""""""""""""""""""""""""""""""""
"=> 全局配置
"""""""""""""""""""""""""""""""""""""
"关闭兼容模式
set nocompatible
"设置历史记录步数
set history=100
"开启相关插件
filetype on
filetype plugin on
filetype indent on
"当文件在外部被修改时2,自动更新该文件
set autoread
"激活鼠标使用
set mouse=a
"""""""""""""""""""""""""""""""""""""
"=>字体颜色
"""""""""""""""""""""""""""""""""""""
"开启语法
syntax enable
"设置字体
"set guifont=dejaVu\ Sans\ MONO\ 10
"
""设置配色
"colorscheme desert
"高亮显示当前行
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00f00
""""""""""""""""""""""""""""""""""""
"=>代码折叠功能
""""""""""""""""""""""""""""""""""""
"激活折叠功能
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>
"""""""""""""""""""""""""""""""""""
"=>文字处理
"""""""""""""""""""""""""""""""""""
"只能缩进
set si
"自动换行
set wrap
"设置软宽度
set sw=4
""""""""""""""""""""""""""""""""""""
"=>vim界面
""""""""""""""""""""""""""""""""""""
set wildmenu
"显示标尺
set ruler
"设置命令行的高度
set cmdheight=11
"显示行数
"set nu
"设置退格
set backspace=eol,start,indent
"显示匹配的括号
set showmatch
"搜索时高亮显示搜索到的内容
set hlsearch
"搜索时不区分大小写
set ignorecase
""""""""""""""""""""""""""""""""""""""
"=>编码设置
""""""""""""""""""""""""""""""""""""""
"设置编码
set encoding=utf-8
"设置文件编码
set fileencodings=utf-8
"设置终端编码
set termencoding=utf-8
"""""""""""""""""""""""""""""""""""""
"=>其他设置
"""""""""""""""""""""""""""""""""""""
"开启新行时使用智能自动缩进
set smartindent
set cin
set showmatch
"隐藏工具栏
set guioptions-=T
"隐藏菜单栏
set guioptions-=m
"显示状态栏(默认值为1,表示无法显示状态栏)
set laststatus=2
"粘贴不换行问题的解决方法
set pastetoggle=<F9>
"设置背景色
set background=dark
"设置高亮相关
highlight Search ctermbg=black ctermfg=white guifg=white guibg=black
autocmd BufNewFile *.sh exec ":.call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#***********************************************")
call setline(3,"#Author: luotianhao")
call setline(4,"#Mail: tianhao.luo.com")
call setline(5,"#Version: 1.0")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#Description: This is a test script.")
call setline(9,"#***********************************************")
call setline(10,"")
endif
endfunc