vim编译器与shell脚本简介

一、vim文本编译器  

    viVisual Interface文本编辑器   文本 ASCII Unicode

 文本编辑种类:行编辑器sed  全屏编辑器:nanovi vim 其他编辑器:gedit(图形),gvimvim图形)

    使用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执行命令                        rcommand读入命令的输入

1.1.2 扩展模式:地址定界

    地址定界start_pos ,eed_pos

    #+#2+3  表示25行   .当前行   $最后一行    %:全文相当于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$

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

                   #yy:复制多行

粘贴命令(ppaste):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 shirtnoh回车

 (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程序:提供了编程的能力解释执行

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

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

高级语言:编译:高级语言à编译器—>目标代码   javacc++

解释:高级语言—>解释器—>机器代码    shell prelpython

编程基本概念:

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

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.表示数据范围   

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

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

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

bash不支持浮点数

变量命名法则:

1.不能使用程序中保留字:如iffor   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

envprintenvexport命令可以所有显示环境变量;  删除变量: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表示;false0表示

1 1 = 11 0 = 00 1 = 0;  0 0 = 0  取小)

1 1 = 11 0 = 10 1 = 1;  0 0 = 0  取大)

     1=0    0=1

2.4.2 短路运算

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

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

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

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

     shell:(datewho | 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则开始执行cmd2cmd1$?≠0则不执行cmd2

 ||表示条件性的or  else  cmd1执行完毕$=0则不执行cmd2cmd1$?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

sourcebash的区别: 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 编辑配置文件生效

修改profilebashrc文件后需生效的两种方法:

    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
下一篇 2016-11-24

相关推荐