vim编译器与shell脚本简介

一、vim文本编译器  

    vi:Visual Interface,文本编辑器;   文本: ASCII Unicode

 文本编辑种类:行编辑器:sed  ;全屏编辑器:nano,vi ,vim ;其他编辑器:gedit(图形),gvim(vim图形)

    使用vi 和vim 的三种主要模式

vim  [OPTION]… FILE…

+#:  打开文件后,直接让光标处于第# 行的行首

+/ PATTERN :打开文件后,直接让光标处于第一个被匹配到的行的行首

vim + file  直接打开file, 光标在 最后一行

vim –b file  二进制方式打开文件  ;vim –d file1 file2… 比较多个文件

vim -m file 只读打开文件   ex file 或 或 vim –e 直接进入ex 模式

v  如果该文件存在,文件被打开并显示内容;如果该文件不存在,当编辑后第一次存盘时创建它

1.1三种主要的模式

  命令模式(默认):移动光标。剪切/粘贴文本  ;插入(编辑)模式:修改文本;扩展命令模式:保存,退出。

Esc:总是返回命令模式

 移动光标,进入插入模式、扩展模式、命令模式

1.1.1命令模式——>>插入模式

       i: insert,  在光标所在处输入  ;I :在当前光标所在行的行首 输入

     a: append,  在光标所在处后面输入  ;A :在当前光标所在行的行尾 输入

   o:  在当前光标所在行的下方打开一个新行  ;O :在当前光标所在行的上方打开一个新行

 锁定和解锁:Ctrl+s  ;Ctrl+q

      扩展模式:q  退出   ;       :q!  强制退出,丢弃做出的修改

              :wq  保存退出  ;   :x  保存退出

  r  filename : 读取filename内容到当前文件中  ;  w  filename:将当前文件的内容写入到filename中

      !command:执行命令   ;                     r!command:读入命令的输入

1.1.2 扩展模式:地址定界

    地址定界:start_pos ,eed_pos

    #,+#:如2,+3  表示2到5行   .:当前行   $:最后一行    %:全文,相当于1,$

   /pat1/  ,/pat2/:从第一次被pat1 模式匹配到的行开始,一直到第一次被pat2 匹配到的行结束

   #,/pat/:从第#行开始,一直到第一次被pat2 匹配到的行结束

  /pat/,$ :从第一次被pat 模式匹配到的行开始,一直到行结束

查找:/PATTERN :从当前光标所在处向文件尾部查找  ;?PATTERN :从当前光标所在处向文件首部查找

    n :与命令方向相同                          ;N:与命令方向相反

替换(s): 在扩展模式下完成查找替换操作

         格式:s/ 要查找的内容/ 替换为的内容/ 修饰符;   要查找的内容:可使用模式

    替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&” 引用前面查找时查找到的整个内容。

修饰符: i:  忽略大小写;      g:  全局替换;默认情况下,每一行只替换第一次出现

         gc: 全局替换,每次替换前询问

      查找替换中的分隔符/可替换为其它字符,例如:s@/etc@/var@g   s#/boot#/#i

1.1.3命令模式

     ZZ:保存退出  ;     ZQ:不保存退出

字符间跳转:h: 左 ;l: 右 ; j: 下 ; k: 上  ; #COMMAND :跳转由# 指定的个数的字符

单词间跳转:

w :下一个单词的词首;  e :当前或下一单词的词尾

b:当前或前一个单词的词首;  #COMMAND :由# 指定一次跳转的单词数

  当前页跳转:

H :页首 ; M:页中间行 ; L:页底  行首行尾跳转:

行首行尾跳转:

^:  跳转至行首的第一个非空白字符;0:  跳转至行首;$:  跳转至行尾

 行间移动:#G 、扩展 模式:#  :跳转至由# 指定行;G :最后一行;1G, gg:  第一行

  翻屏操作:

    Ctrl+f:  向文件尾部翻一屏 ; Ctrl+b:  向文件首部翻一屏

           Ctrl+d:  向文件尾部翻半屏 ; Ctrl+u:向文件首部翻半屏

字符编辑:

    x:  删除光标处的字符;#x:  删除光标处起始的# 个字符

     xp:  交换光标所在处的字符及其后面字符的位置 ;  ~:转换大小写

     替换命令:r:替换光标所在处的字符

删除命令d: d$:删除到行尾;  d^:删除到非空行首;  d0:删除到行首;dd:删除光标所在的行

            #dd:多行删除;  D:从当前光标位置一直删除到行尾,等同于d$。

复制命令(y,yank):y:复制,行为相似于d命令  yy:整行复制; Y:从光标位置复制到行尾

                   #yy:复制多行

粘贴命令(p,paste):p:缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面。

改变命令:(c)修改后切换至插入模式。同删除复制命令。

撤销更改: u 撤销最近的更改; #u 撤销之前多次更改; U  撤消光标落在这行后所有此行的更改

                     按Ctrl – r 重做最后的“撤消”更改;  .  重复前一个操作; v n.:重复前一个操作n次

特殊用法:100iwang [ESC] :粘贴“wang ”100次 

   <start position><command><end position>

      Command:   y  复制、d  删除、gU  变大写、gu  变小写

如 例如 0y$  命令意味着:

0 → →  先到行头  ;y → →  从这里开始拷贝;  $ → →  拷贝到本行最后一个字符

ye:从当前位置拷贝到本单词最后一个字符

1.2 vim寄存器

    有26 个命名寄存器和1 个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享。

用a ,b,…,z 表示, 用“ 寄存器表示,放在数字和命令之间

如:3"tyy  表示复制3 行到t 寄存器中

    "tp 表示将t 寄存器内容粘贴

 未指定,将使用无命名寄存器

    有10 个数字寄存器,用0 ,1 ,… ,9 表示,0 存放最近复制内容,1 存放最近删除内容。当新的文本变更和删除时,1 转存到2 ,2 转存到3 ,以此类推。数字寄存器不能在不同会话间共享

编辑二进制文件:

      以二进制方式打开文件  vim  –b  binaryfile

      扩展命令模式下,利用xxd 命令转换为可读的十六进制  :%!xxd

      编辑二进制文件

      扩展命令模式下,利用xxd 命令转换回二进制  :%!xxd –r

      保存退出

      可视化和多窗口

1.3 定制vim的工作特性

配置文件:永久有效   全局:/etc/vimrc  ;个人:~/.vimrc

扩展模式:当前vim 进程有效

 (1)  行号

显示:set number,  简写为set nu ;取消显示:set nonumber,  简写为set nonu

 (2)  括号成对匹配

匹配:set showmatch,  简写为set sm  ;取消:set nosm

  (3)  自动缩进

启用:set ai  ;禁用:set noai

(4)  高亮搜索

启用:set hlsearch  ;禁用:set nohlsearch

(5)  语法高亮

启用:syntax on  ;禁用:syntax off 、shirt:noh回车

 (6)  忽略字符的大小写

启用:set ic  ;不忽略:set noic

(7)  文件格式

启用windows 格式:set fileformat=dos  ;启用unix 格式:set fileformat=unix

(8)  设置文本宽度

:set textwidth=65 (vim only)   ;  :set wrapmargin=15

   :help option-list             ;  :set or :set all

vi/vim内置帮助

:help    ;  :help topic    ;  Use :q to exit help   

vimtutor

二、*shell脚本编程

2.1 shell的简单介绍

编程基础  : 程序:指令+数据

程序编程风格:过程式:以指令为中心。数据服务于指令。

对象式:以数据为中心,指令服务于数据

shell程序:提供了编程的能力,解释执行

程序的执行方式:计算机运行二进制指令

编程语言:低级语言:汇编语言

高级语言:编译:高级语言à编译器—>目标代码   (java,c,c++)

解释:高级语言—>解释器—>机器代码    (shell ,prel,python)

编程的基本概念:

编辑逻辑处理方式:顺序执行  循环执行  选择执行

shell编程:过去式、解释执行

编程语言的基本结构:

数据存储:变量、数组    表达式:a+d   语句:if

shell脚本基础

shell脚本是包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行执行shebang机制:

   #!/bin/bash     #!/usr/bin/python    #!/usr/bin/perl

2.2 shell脚本的用途

1、自动化常用命令;2、执行系统管理和故障排除;3、创建简单的应用程序;4、处理文本或文件

创建shell脚本:

第一步:使用文本编辑器来创建文本文件

第一行必须包括shell声明序列:#!/bin/bash  ;添加注释以#开头

第二步:运行脚本

给予执行权限,在命令行上指定脚本的绝对或相对路径;直接运行解释器,将脚本作为解释器程序的参数运行

脚本调试:

bash –n /path/to/some_script(脚本名) :检查第几行的语法错误,不能检查到命令的错误

    删除PATH变量的命令的脚本路径;同时还需要用hash –d cmd 清除路径

bash –x /path/to/some_script:调试执行

bash:即使脚本没有执行权限,也可以用bash运行

2.3 变量

    变量:命令的内存空间

数据的存储方式:  字符;     数值:整型;浮点型

变量作用:1.数据存储格式;2.参与的运算;3.表示数据范围   

类型:字符;数值:整型、浮点型

强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误如:java,pyrhon

弱类型:无须指定类型,默认为字符型;参与运算会自动进行隐式类型转换;变量无需事先定义可直接调用

如:bash不支持浮点数

变量的命名法则:

1.不能使用程序中保留字:如if,for ;   2.见名知义

3.只能使用数字、字母、和下划线,且不能以数字开头;  4.统一命名规则:驼峰命名法

bash中变量的种类:

2.3.1本地变量

    生效范围为当前shell进程,对当前shell之外的其他shell(包括子shell)进程都无效 当然子shell进程的变量也不能在父进程中生效。

变量赋值:name=”value”

      可以使用引用的value的条件:

  (1)可以是直接字串:name=”root”  ;(2)变量引用:name=”$USER” ;

  (3)命令引用:name=`COMMAND` ; name=$(command) ;

变量引用:${name} ,$name

    “”:弱引用,其中的变量引用会被替换为变量值 ; ‘’:强引用,其中的变量引用保持原字符串

    set命令可以查看系统定义的所有变量,还有函数;   删除变量:unset  name

编写的脚本相当于子进程,可以直接使用系统定义的环境变量。

pstree显示当前的进程树; 脚本中sleep表示休眠一会儿,利于查看进程树

2.3.2 环境变量 

    用export(等价于declare – x)声明能把父进程的变量传递给子进程,但是如果子进程设置的环境变量与父进程冲突,那父进程中显示的是子进程的变量。而且子进程定义的变量不会传递给父进程。(bash特殊例外)

    变量声明、赋值:export name =value  ;  declare –x name =value

    变量引用:${name} ,$name

env、printenv、export命令可以所有显示环境变量;  删除变量:unset name

    bash中有许多内建的环境变量:PATH,SHELL,USER,UID,HISTSIZE,HOME,PWD,OLDPWD,HISTFILE

局部变量

   生效范围为当前shell进程中某代码片段(通常指函数)fun1() { locate var=function; },只在函数中使用。

只读变量

    只能声明,不能修改删除: readonly  name  ;  declare  -r  name

2.3.3 位置变量

     $1,$2,$3……来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

$1, $2, … :对应第1 、第2 等参数,shift [n] 换位置  但是到$10就必须用${10}  ;$0:  命令本身

示例:判断给出的文件的行数

    linecount="$(wc -l $1| cut -d' ' -f1)"   echo “$1 has $linecount lines.”

2.3.4 特殊变量:$?,$0,$*,$@,$#

$*:  传递给脚本的所有参数,全部参数合为一个字符串

$@:  传递给脚本的所有参数,每个参数为独立字符串

$#:  传递给脚本的参数的个数  ;$@ 与$*  只在被双引号包起来的时候才会有差异

2.4 bash中的算术运算

    help ;let         +, -, *, /, % 取模(取余), ** (乘方)

实现算术运算:

(1) let var= 算术表达式  ;  (2) var=$[ 算术表达式 ](表达式前后有空格)  ;  (3) var=$(( 算术表达式 ))

(4) var=$(expr arg1 arg2 arg3 …)  ;  (5) declare  -i  var =  数值  ;  (6) echo ‘ 算术表达式’| bc

              乘法符号有些场景中需要转义 ;  [[  ]]:两个括号才能支持正则表达式

bash 有内建的随机数生成器:$RANDOM (1-32767) 

echo $[$RANDOM%50]  :0-49之间的随机数

    赋值:增强型赋值: += ,-= ,*= ,/= ,%=

let  var(变量)OPERvalue  例如:let  count+=3 ,自加3后自赋值

自增,自减: let var+=1  , let var++  , let var-=1  , let var—

(注意:变量用完了,注意unset,要不然可能与bash中运行的起冲突)

2.4.1 逻辑运算

    true 用1表示;false用0表示

与:1 与 1 = 1; 1 与 0 = 0; 0 与 1 = 0;  0 与 0 = 0  (取小)

或:1 或 1 = 1; 1 或 0 = 1; 0 或 1 = 1;  0 或 0 = 0  (取大)

非!:     !1=0  ;  !0=1

2.4.2 短路运算

短路与:第一个为0 ,结果必定为0;第一个为1,第二个必须参加运算

短路或:第一个为1,结果必然为1;第一个为0,第二个必须参加运算

异或:^  异或的两个值,相同为假,不同为真

     聚集命令:复合式:date;who | wc  -l  (命令会一个接一个地运行)

     子shell:(date;who | wc  -l)>> /tmp/trace  (所有的输出都会被发给单个标准输出和错误输出)

     退出状态:进程使用退出状态来报告成功或失败  ;

0:代表成功;1-255:代表失败   ; $?:变量保存最近命令的退出状态(shell中最后一个命令)

例如: #ping –c1 –w1 hostdown &> /dev/null && echo the host is up  (用来扫描网段是否开通)

    退出状态码:exit [n] :自定义退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即退出;终止退出状态取决于exit命令后面的数字(0:成功)

注意:如果未给脚本指定退出状态码,整个脚本退出状态码取决于脚本执行的最后一条命令状态码

2.5 编写shell脚本

2.5.1 条件测试

    判断某需求是否满足,需要由测试机制来实现;专用的测试表达式需要由测试命令辅助完成

  评估布尔声明 ,以便在条件性执行使用  若成功(为真),则返回0;若失败(为假),则返回1。

测试命令:test  expression  ; [ expression ]  ;[[ expression ]];(注意:expression 前后必须要有空白字符)

    条件性的执行操作符:根据退出状态而定,命令可以有条件的运行

 &&表示条件性的and ,then  若cmd1执行完毕且$?=0,则开始执行cmd2;若cmd1$?≠0,则不执行cmd2

 ||表示条件性的or  else  若cmd1执行完毕且$?=0,则不执行cmd2;若cmd1$?≠0,则继续执行cmd2

test命令:长格式的例子:

    $test “$A” == “$B” && echo “Strings are equal”  (比较字符串是否相等)

    $ test “$A” –eq “$B” && echo “Integers are equal”  (比较数字是否相等)

简单格式的例子:

    $[ “$A” == “$B” ] && echo  “Strings are equal”  

    $ [ “$A” –eq “$B” ] && echo “Integers are equal”

2.5.2 数值测试

     -gt:是否大于  ;-ge:是否大于等于  ;-eq是否等于

     -lt:是否小于  ;-le:是否小于等于  ;-ne:是否不等于

          常在if结构中出现

2.5.3 字符串测试

     == :是否等于; >: ascii 码是否大于ascii码 ;  <:  是否小于

     !=:  是否不等于 ;  =~:  左侧字符串是否能够被右侧的PATTERN所匹配

注意:  此表达式一般用于[[ ]] 中;扩展的正则表达式

      -z "STRING" :字符串是否为0个,空为真,不空为假

      -n "STRING" :字符串是否不为0个,不空为真,空为假

注意:用于字符串比较时的用到的操作数都应该使用引号

2.5.4文件测试

2.5.4.1 存在性测试

    –a FILE :同-e  ;  -e FILE:  文件存在性测试,存在为真,否则为假

    存在性及性能测试:-b FILE :是否存在且为块 设备文件

-c FILE :是否存在且为字符 设备文件   ;   -d FILE :是否存在且为 目录文件

-f FILE :是否存在且为 普通文件    ;    -h FILE 或 或 -L FILE :存在且为符号 链接文件

-p FILE :是否存在且为命名 管道文件    ;-S FILE :是否存在且为套接先判断存在性,再判断类型

    注意:-f有一个坑,会判断链接文件指向的文件或者目录;

因而,判断文件类型,先判断文件是否存在,再判断文件是否是链接文件,最后才判断文件类型

    例如:/bin 是一个特殊的链接文件 find查找bin下的目录 必须用 find /bin/

2.5.4.2 文件权限测试

-r FILE :是否存在且可读  ;-w FILE:  是否存在且可写  ;-x FILE: 是否存在且可执行

      注意:-x:文件没有x的话即使是root也没有执行权限

文件特殊权限测试:-u FILE :是否存在且拥有suid 权限  ;

-g FILE :是否存在且拥有sgid 权限  ;  -k FILE :是否存在且拥有sticky 权限

2.6.3 文件大小测试

    -s  FILE:是否存在且非空

文件是否打开: -t fd: fd 表示文件描述符是否已经打开且与某终端相关

    -N FILE :文件自动上一次被读取之后是否被修改过

    -O FILE :当前有效用户是否为文件属主  ; -G FILE :当前有效用户是否为文件属组

2.5.5 双目测试

    FILE1 -ef FILE2: FILE1 与FILE2 是否指向同一个设备上的相同inode

    FILE1 -nt FILE2: FILE1 是否新于FILE2    ;    FILE1 -ot FILE2: FILE1 是否旧于FILE2

2.5.6 组合测试

第一种方式:

COMMAND1 && COMMAND2  并且   ;   COMMAND1 || COMMAND2  或者

    ! COMMAND 非   如:[[  -r FILE  ]] && [[  -w FILE  ]]是否为可读和可写文件

 第二种方式:

EXPRESSION1 -a EXPRESSION2  并且    ;   EXPRESSION1 -o EXPRESSION2  或者

! EXPRESSION  非 ;必须使用测试命令进行; 格式必须要严格,必须是单个括号;多个括号就不能匹配-a,-o了;

v示例:# [ -z “$HOSTNAME” -o $HOSTNAME "=="localhost.localdomain" ] && hostname www.magedu.com

      空字符串$HOSTNAME或者主机名为localhost.localdomain,就执行homename改为www.magedu.com

        # [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

      /bin/cat文件为可执行且普通文件,就执行访问/etc/fstab

2.6 read命令来接受输入

使用read来把输入值分配给一个或多个shell变量:

        -p:指定要显示的内容,相当于echo,备注信息   ;   -t :输出时间

read  – p  “Enter  a  filename:” FILE   (FILE前面有空格)

 read 从标准输入中读取值,给每一个单词分配一个变量所有剩余单词都被分配给最后一个变量。

使用read功能接收输入内容:读变量如:read name  echo $name

vim inputyourname

#!/bin/bash

#

#echo “please input your name ”

read –t 3 –p “please input your name:” name

echo “your name is $name”

 

read –p “Do you agree ? yes or no:”answer

[ $answer==yes ]&&echo “haha”|| echo “hehe”

三、bash的配置文件

按生效范围划分,存在两类:

全局配置:/etc/profile      /etc/profile.d/*.sh       /etc/bashrc

个人配置:~/.bash_profile     ~/.bashrc

建议修改用户登录是的信息建议在/etc/profile.d/*.sh 中

source和bash的区别: bash 会影响子进程的脚本   ;source仅影响自己本身的脚本

3.1 shell登录的两种方式

3.1.1 交互式登录

    (1) 直接通过终端输入账号密码登录;(2) 使用“su – UserName”  切换的用户

执行顺序:/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc

profile类:为交互式登录的shell提供配置:

全局:/etc/profile  、/etc/profile.d/*.sh  ;个人:~/.bash_profile

    功用:(1)用于定义环境变量  ;   (2):运行命令和脚本

3.1.2非交互式登录

    (1)su UserName  ;(2) 图形界面下打开的终端   ;(3) 执行脚本

执行顺序:~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh

bashrc 类:为非交互式和交互式登录的shell提供配置:

全局:/etc/bashrc  ;  个人:~/.bashrc

    功用:(1)定义命令别名和函数  ;(2)定义本地变量

 3.2 编辑配置文件生效

修改profile和bashrc文件后需生效的两种方法:

    1.重新启动shell进程  ;  2. .或source 例如: .~/.bashrc

bash保存在~/.bash_logout文件中(用户);在退出登录shell时运行;用于创建自动备份、清除临时文件。

    du sh file 可以查看文件file的大小,便于查看清除不需要的临时文件

 3.3bash如何展开命令行

1.把命令行分成单个命令词   2.展开别名   3.展开大括号种的声明({}) 

4. 展开波浪符声明(~)     5.命令替换$() 和 “    6.再次把命令行分成命令词

7.展开文件通配(* 、? 、[abc] 等等)   8.准备I/0 重导向(< 、>) 防止扩展

    反斜线(\ )会使随后的字符按原意解释

如:$ echo Your cost: \$5.00   Your cost: $5.00

 加引号来防止扩展: 单引号(’ )防止所有扩展

双引号(” )也防止所有扩展,但是以下情况例外:

 $ (美元符号) - 变量扩展         ;     ` (反引号) - 命令替换

 \ (反斜线) - 禁止单个字符扩展   ;   ! (叹号) - 历史命令替换

 

原创文章,作者:lyx,如若转载,请注明出处:http://www.178linux.com/60601

赞 (0)
lyxlyx
上一篇 2016-11-24 00:03
下一篇 2016-11-24 11:20

相关推荐

  • 马哥教育网络班21期+第9周课程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登陆shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash while read line; do     if [[ $line&n…

    Linux干货 2016-09-01
  • 编译Bind和压力测试

    编译安装bind ·下载bind:     isc.org:          bind-9.8          bind-9.9   &…

    Linux干货 2016-09-25
  • LINUX-用户和组管理

    LINUX用户和组管理 linux用户分类:Username/UID      管理员:root,UID 0号,拥有最高权限;负责系统的启功、停止,安装新软件,               增加、删除用户,保证系统正常运转;     &nb…

    2017-05-30
  • 马哥教育网络班第21期+第六周课程作业

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的1、以至少一个空白字符开头的行的行首加#; :%s@^[[:space:]]\+@#@   2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符; :%s@^[[:space…

    Linux干货 2016-08-22
  • Linux学习总结&day07-正则表达式&文本处理工具

    第一部分、正则表达式     1、什么是正则表达式     正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易的达到查找、删除、替换某特定字符串的处理程序。     正则表…

    Linux干货 2016-08-08
  • Mariadb数据库复制系列(四):复制过滤器的实现

       实验四:复制过滤器的实现 复制过滤器的作用是让从节点仅复制主节点的指定的库,或指定数据库的指定表,而不是全部复制。其配置方式有两种,一种是在主节点上配置,通过定义主节点只记录部分库或表产生的二进制日志时间来实现;一种是通过从节点上配置,当复制了主节点的所有的二进制日志数据后,在SQL线程执行时,只执行指定的库或表相关的二进制日志时间;一般采取在从节点上…

    Linux干货 2016-11-24