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.shsh 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脚本开发的基本规范及习惯

开发规范:

  1. Shell脚本第一行指定脚本解释器
  2. Shell脚本开头会添加版本、版权等信息
  3. 在Shell脚本中尽量不用中文(不限于注释)。尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。如果非要加中文,请根据自身的客户端对系统进行字符集调整,如:export LANG="zh_CN.UTF-8",并在脚本中,重新定义字符集设置,和系统保持一致。
  4. Shell脚本的命名应该以.sh为扩展名
  5. Shell脚本应存放在固定的路径下

良好习惯:

  1. 成对的符号,一次性写出来,防止遗漏
  2. 中括号[]的两端至少有一个空格
  3. 流程控制语句,应一次性将格式写完,再添加内容
  4. 对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,需要强引用的(指所见即所得的字符引用),则用单引号(' '),如果是命令的引用,则用反引号( )。例如: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
posted @ 2021-03-07 22:42  春刀c  阅读(240)  评论(0编辑  收藏  举报