1、vim的基本用法

2、vim的高级用法

3、bash编程初步

4、bash算术运算、位置参数和read


一、文本编辑工具 vi vim     vimtutor在线帮组文档

        全屏编辑器(nano,emacs,vi),行编辑器(sed)

        vim三种模式:(visual interface improved)编辑模式、 输入模式、末行模式

        编辑模式—>输入模式(i:在光标所在处之前输入a:光标所在处之后输入o:光标下新建一行进入输模                                 I:在行首进入输入模式、A:在行尾进入输入模式、O:光标上新建一行进入输入模式)

        输入模式—>编辑模式:ESC

        编辑模式<—>末行模式:

    保存退出:(q!:不保存退出、wq:保存退出、x:保存退出、wq!:强制保存退出、zz:编辑模式保存退出)

    编辑文本:

        光标移动:字符间移动:h:左、j:下、k:上、l:右 ;结合数字如:n{hjkl}  20l

                  单词间跳转:w:下一次词首、e:当前或下一个词尾、b:当前或前一个词首

                  行内移动:^ :行首第一个空白字符、0:绝对行首、$:绝对行尾

                  句子间移动:): 向前跳一句、(::向后跳一句     段落间:}{

                  行间移动:#G :直接跳转至第#行、G 最后一行

        编辑命令:x:删除光标所在处字符  #x:光标处向右删除#个字符

                  d:删除命令(结合光标跳转字符(w,b,e,$,0,^)使用,删除跳转范围内的字符)、#d

                  dd:删除光标所在行 ,支持 #dd

                  d$=D:删除光标到所在行行尾   

                  注意:最后一次删除的内容保存至缓存区,可以粘贴、还原。

                  p:paste 粘贴  小写p:光标所在处后方   大写P:光标所在上行粘贴

                  y:yank  复制 (结合光标跳转字符(w,b,e,$,0,^)使用,删除跳转范围内的字符)   

                     如:3yy 复制3行。 大写Y = yy

                  c:change,修改(先删除,再转换为输入模式)

                    cc=C:删除光标所在处的正行转换输入 , 支持#cc 3cc

        撤销编辑:u :undo,撤销最多50次,支持 #u :撤销最近的#次操作

                  ctrl+r :撤销上次撤销的命令

                  . 点号重复前一条命令


二、  末行模式:

        行跳转:

        内容定界:statrpos,endpos

                #:第#行  .:当前行  $:最后一行  10,$-1 :10行至倒数第2行  %:全文,相当于1,$

                c,d,y 等命令可以直接附加在地址范围后使用

                w /path/to/somefile: 将选定范围内的内容保存至某文件中

                r /path/from/somefile:将制定的文件中的内容读取到指定位置 

                s/查找模式/要替换成的内容/gi (查找模式可以使用正则表达式,要替换成的内容不能使用模式,g:global 全部替换,i:不区分大小写)

    

练习:

  1、复制/etc/rc.d/init.d/functions至/tmp目录,替换/tmp/functions文件的/etc/sysconfig/init为/var/log

    %s/\/etc\/sysconfig\/init/\/var\/log/gi

    %s@/etc/sysconfig/init@/var/log@gi


  2、复制/etc/grub.conf至/tmp目录,删除/tmp/grub.conf文件中的行首的空白字符;

    %s@^[[:space:]]\{1,\}@@g


  3、复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#号;

    %s@^\([[:space:]]\{1,\}.*\)@#\1@

    %s@^[[:space:]]\{1,\}.*@#&@


  4、删除/tmp/rc.sysinit文件中以#开头且后面跟了至少一个空白字符的行的行首的#号和空白字符;

    %s@^#[[:space:]]\{1,\}@@


  5、为/tmp/grub.conf文件中前三行的行首加#号;

    1,3s@^@#@


  6、将/etc/yum.repos.d/CentOS-Media.repo文件中的所有enable=0和gpgcheck=0两行最后的0改为1;

    %s@enable=0@enable=1@

    %s@\(enable\|gpgcheck\)=0@\1=1@g

    

        vim可视化模式:v:光标划过的字符被选中 V:光标划过的行被选中 d:删除

        文本查找:用法同less命令  /pattern 文件首部到尾部的查找, ?pattern 文件尾部到首部的查找,

                                n查看下一个、N查看上一个、翻屏Ctrl+f向后翻一屏Crrl+b向前翻一屏

        多文件模式::next下一个,:previous前一个,:last最后一个,:first第一个,:wqall保存所有文件

        多窗口模式: 多文件:vim -o file1 file2  (o垂直窗口,O水平窗口) 窗口间切换ctrl+w +方向箭头

                     单文件:进行切割Ctrl+w,s水平切割、Ctrl+w,v垂直切割、vim + file跳转到文件末行

              窗口属性定义:set nu显示行号, set nonu取消显示行号 (全局文件/etc/vimrc,家目录~/.vimrc)

                                       set ai 自动缩进,set noai取消缩进 ;

                                       set ic 忽略字符大小写 set noic 不忽略字符大小写

                                       set sm显示匹配的另一半括号,set nosm

                                       set hlsearch搜索高亮显示,set nohlsearch取消搜索高亮

                                       syntax (off|on)语法高亮显示关闭或开启。

                            注意:配置文件  全局有效/etc/vimrc,用户生效~/.vimrc。

三、bash 编程初步

        bash进程是一个解释器 (-n 测试语法错误,-x 单步执行显示过程)

        shell脚本格式:第一行顶格 

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

               #descriptions:描述

               #version:版本号

               #author:作者

               #date:日期 等 #号开头的行均为注释,会被解释器忽略。

        例如:创建一个组newgroup,id号8008、创建一个用户,名字为mageedu,id号为3306,附加组为newgroup

              创建目录/tmp/hellobash ,复制/etc/rc.d/init.d/functions至/tmp/hellobash目录中

               #!/bin/bash

               #author:wenjia

               #date:2015.11.09

               groupadd -g 8008 newgroup

               useradd -u 3306 -G newgroup mageedu

               mkdir /tmp/helloabsh

               cp /etc/rc.d/init.d/functions /tmp/hellobash  保存为first.sh ,这就是一个脚本。

            给脚本赋予执行权限 #chmod +x first.sh   测试脚本 #bash -n first.sh (测试脚本语法错误)

               执行脚本./first.sh(脚本文件在当前目录,否则bash会到PATH按顺序查找first.sh文件)

        过程式编程语言执行顺序:

               顺序执行(顺序执行其中一条命令错误,不影响其他)

               选择执行:测试条件,可能会测试多个条件,某条件满足时,执行对应的分支

               循环执行:将同一段代码反复执行多次,因此,循环必须有退出条件;否则陷入死循环。

        变量类型:本地变量、环境变量(export:导出)、局部变量、位置变量、特殊变量

        位置变量:记录所传参数对应信息,如 $1 $2 $3……${10} ;$0

               如:  #!/bin/bash

                   # echo $1

                   # echo $2  

                   # chmod +x third.sh , ./third.sh 11 22 

                   执行结果为 11 22 ,$1为11 $2为22 $0为third.sh 这就是位置变量。

        练习:写一个脚本,能接受一个参数作为用户名,此脚本可创建次用户,并且其密码同用户名一样

               #vi useradd.sh  #chmod +x useradd.sh  

               #!/bin/bash  

                 useradd  $1

                 echo $1 | passwd --stdin $1 &> /dev/null 这就是一个位置脚本

               #./useradd user2015    那么用户user2015创建成功,密码user2015

        特殊变量:

               $?:状态返回值

               $#:传递给脚本参数的个数

                   如:echo $1 echo $2 echo $n  

                   #./forth.sh 11 22 33 44  执行脚本结果为:11 22 4

            $*:显示传递脚本的所有参数($@也可以)   

                    如:echo $1 echo $2 echo $n $* 

                    #./forth.sh 11 22 33 44  执行脚本结果为:11 22 4 11 22 33 44

                shift: (轮替位置参数,内置命令)执行完$1后,$2替换原来$1位置继续执行。

                    如:#!/bin/bash

                        echo $1 shift echo $1 shift echo $1

                        ./fifth.sh 11 22 33 执行结果为 11 22 33 而不是 11 11 11 。

        

        bash的循环语句:

            for:遍历有限的元素列表(适合循环次数已知的环境)

            while:(适合循环次数未知的环境)    

            until:

            for语句的格式:

                for VAR_NAME in LIST

                do

                    循环体

                done

                LIST:列表,中间包括一个或多个元素    

        例如:添加user301……user310 10个用户。

                分析:生成数值列表{1..100}或 seq 命令引用

             脚本文件,#!/bin/bash

                       for uno in {301..310};do

                    或 for uno in $(seq 301 310);do

                    或 for uno in `seq 301 310`;do

                            useradd user${uno}

                       done

        练习:创建目录/tmp/dir-当前日期时间:如/tmp/dir-20140707-155503

              在此目录中创建10个空文件夹,分别为file1--file10         

                #!/bin/bash

                dstDir=/tmp/dir-$(date +%Y%m%d-%H%M%S)

                mkdir $dstDir

                for no in {1..10};do

                    touch $dstDir/file${no}

                done

          

        练习:写一个脚本

            1、创建用户tuser1-tuser9; 

    2、创建目录/tmp/dir-当前日期时间;

    3、在/tmp/dir-当前日期时间 目录中创建9个空文件file101-file109

    4、将file101的属主改为tuser1,依次类推,一直将file109的属主改为tuser9

            #!/bin/bash

            dstdir=/tmp/dir-$(date +%Y%m%d-%H%M%S)

            mkdir $dstdir

            for i in {1..9};do

                useradd tuser$i

                touch $dstdir/file10$i

                chown tuser$i $dstdir/file10$i

            done