美文网首页Linux相关
5.vi编辑器以及简单的SHELL脚本

5.vi编辑器以及简单的SHELL脚本

作者: 闻闻爸 | 来源:发表于2017-11-01 15:46 被阅读0次

    了解vim编辑器

    在Linux系统中配置应用服务,实际上就是在修改它的配置文件(配置文件可能有多个,其中包含不同的参数),而且日常工作中也一定免不了编写文档的事情吧,这些都是要通过文本编辑器来完成的。
    在热门Linux操作系统中都会默认安装一款超好用的文本编辑器——名字叫“vim”,vim是vi编辑器的升级版。
    Vim能够得到这么多厂商与用户的认可,原因就是在Vim编辑器中有三种模式——命令模式、末行模式和编辑模式,分别又有多种不同的命令快捷键组合,很大的提高了工作效率,用习惯后会觉得非常的顺手。要想在文本操作时更加高效率,我们必需先搞清Vim编辑器的三种模式的操作不同与切换方法。
    命令模式:控制光标移动,可对文本进行删除、复制、粘贴等工作。
    输入模式:正常的文本录入。
    末行模式:保存、退出与设置编辑环境。
    记住每次运行vim编辑器后都默认是“命令模式”,需要先进入到“输入模式”后再进行编写文档的工作,而每次编辑完成需先返回到“命令模式”后再进入“末行模式”对文本的保存或退出操作.
    这里为大家总结出了最常用的快捷键命令,尽量记一下,忘记了来查也可以,至于“输入模式”则没有特殊技巧。
    vim编辑器的命令模式中常用的快捷键

    命令 作用
    dd 删除(剪切)光标所在整行。
    5dd 删除(剪切)从光标处开始的5行。
    yy 复制光标所在整行。
    5yy 复制从光标处开始的5行。
    p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后。
    /字符串 在文本中从上至下搜索该字符串。
    ?字符串 在文本中从下至上搜索该字符串。
    n 显示搜索命令定位到的下一个字符串。
    N 显示搜索命令定位到的上一个字符串。
    u 撤销上一步的操作

    vim编辑器的末行模式中的常用命令

    命令 作用
    :w 保存
    :q 退出
    :q! 强制退出(放弃对文本的修改内容)
    :wq! 强制保存退出
    :set nu 显示行号
    :set nonu 不显示行号
    :命令 执行该命令
    :整数 跳转到该行

    需要读者注意的两点:
    1.在命令模式与末行模式中,所有的快捷键参数均区分大小写。
    2.在末行模式中所有快捷键参数前都有一个冒号”:“。

    编写文档

    编写简单文档

    配置主机名称

    红帽RHEL7系统的主机名称保存在/etc/hostname文件中,我们要想将其修改为”test.com“,思路大致如下:

    第1步:使用vim命令修改”/etc/hostname“主机名称文件。
    第2步:将原始主机名称删除后追加”test.com“。
    第3步:保存退出并用hostname命令检查是否修改成功。
    使用vim命令编辑主机名称文件后末行模式执行:wq!后即可保存退出:
    [root@test ~]# vim /etc/hostname
    test.com
    使用hostname命令查看当前的主机名称:
    [root@test ~]# hostname
    test.com

    配置网卡信息

    既然已经会用vim编辑器了,快来试试配置你的Linux系统网卡吧,不把网卡先配置妥当就不能与其他机器通信的。
    在红帽RHEL6系统中网卡配置文件的前缀为”eth”,第1块即为”eth0″,第2块即为”eth1″并依此类推……
    而在红帽RHEL7系统中网卡配置文件的前缀则为”ifcfg-eno“,例如”ifcfg-eno16777736″。

    网卡的配置文件存放在“/etc/sysconfig/network-scripts”目录中。
    在修改配置文件前,先来学些关键词术语吧:

    网卡类型:TYPE=Ethernet
    地址分配模式:BOOTPROTO=static
    网卡名称:NAME=eno16777736
    是否启动:ONBOOT=yes
    IP地址:IPADDR=192.168.10.10
    子网掩码:NETMASK=255.255.255.0
    网关地址:GATEWAY=192.168.10.1
    DNS地址:DNS1=192.168.10.1

    上面的网卡配置文件代表着“这是一个以太网卡设备,名称为”eno16777736″且开机自动启动,IP地址等信息需由人工指定”。
    配置网卡信息前先来理清思路:

    1. 首先我们要切换到”/etc/sysconfig/network-scripts“目录中(该目录存放着网卡的配置文件)。
    1. 使用vim命令修改文件”ifcfg-eno16777736“。
    2. 逐项写入配置参数,并保存退出。
    3. 重新启动网卡命令:”systemctl restart network“。
    4. 通过ping命令测试网卡信息是否生效

    配置yum仓库

    既然对vim编辑器的理论已经学扎实,现在就来动手配置下Yum仓库吧~先来理清思路:

    1. 首先我们要切换到”/etc/yum.repos.d/“目录中(因为该目录存放着yum仓库的配置文件)
    2. 使用vim编辑器创建并打开一个名为rhel7.repo的新文件,名称可以自定义,但后缀必需为repo。
    3. 逐项写入配置参数,并保存退出。
    4. 按配置参数的路径将光盘挂载。
    5. 将光盘挂载信息写入到/etc/fstab文件中。
    6. 使用”yum install httpd -y“命令检查是否配置正确。

    切换到/etc/yum.repos.d目录中:

    [root@linuxprobe ~]# cd /etc/yum.repos.d/
    打开Vim界面后敲击”a”进入到插入模式:
    编辑完成后敲击[ESC]并在末行模式中:wq!保存并退出。
    [root@linuxprobe yum.repos.d]# vim rhel7.repo
    [rhel7]
    name=rhel7
    baseurl=file:///media/cdrom
    enabled=1
    gpgcheck=0

    创建挂载光盘的目录:
    [root@linuxprobe yum.repos.d]# mkdir -p /media/cdrom
    仓库提供方式为本地,所以需要将光盘挂载到/media/cdrom中:
    [root@linuxprobe yum.repos.d]# mount /dev/cdrom /media/cdrom
    mount: /dev/sr0 is write-protected, mounting read-only
    设置成开机自动挂载:
    [root@linuxprobe yum.repos.d]# vim /etc/fstab
    /dev/cdrom /media/cdrom iso9660 defaults 0 0
    测试安装”httpd”服务,出现“Complete”则代表Yum仓库配置正确:
    [root@linuxprobe yum.repos.d]# yum install httpd
    Loaded plugins: langpacks, product-id, subscription-manager
    rhel7 | 4.1 kB 00:00
    (1/2): rhel7/group_gz | 134 kB 00:00
    (2/2): rhel7/primary_db | 3.4 MB 00:00
    Resolving Dependencies
    Complete!

    SHELL脚本

    我曾经将Shell形容是人与计算机硬件的“翻译官”,Shell作为用户与Linux系统通讯的媒介,自身也定义了各种变量与参数,并提供了诸如循环、分支等高级语言才有的控制结构特性。如何正确的使用这些功能,准确下达命令就显得尤为重要。
    Shell的工作形式分为两种
    交互式(Interactive):用户输入一条命令,Shell解释并执行一条。
    批处理(Batch):用户事先编写一个Shell脚本(Script),其中包含诸多命令,Shell会一次执行完所有命令。
    那么大家在前面学习Linux命令时,大致就是属于交换式了,Shell脚本是将各种命令通过逻辑语句组合而成的程序。
    Shell脚本需要用到很多的Linux命令以及结合之前学习过的正则表达法、管道命令以及数据流重定向等语法规则来完成指定任务。
    查看系统中所有可用的Shell解释器:
    [root@linuxprobe ~]# cat /etc/shells

    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin
    /bin/tcsh
    /bin/csh

    查看当前的Shell解释器:
    [root@linuxprobe ~]# echo $SHELL
    /bin/bash

    编写脚本

    编写简单的脚本

    Shell脚本的编写要使用到Vim文本编辑器,按照命令的执行顺序依次编写,每行写一条Linux命令。并且一个完整的Shell脚本则应该包括“脚本声明”、“注释信息”和“可执行语句”。
    脚本声明(#!):告知系统用何种shell来解释。
    注释信息(#):对可执行语句或程序功能做介绍,可以不写。
    可执行语句:执行的具体命令。
    先来编写一个简单的Shell脚本吧,功能是显示当前的工作路径并列出当前目录下的所有文件与属性。
    [root@linuxprobe ~]# vim Example.sh

    #!/bin/bash    
    #My first shell by xuwenhui    
    pwd   
    ls -al
    

    原来编写Shell脚本如此的简单~执行脚本有三种方法:
    脚本文件路径:./Example.sh
    sh脚本文件路径:sh Example.sh
    source脚本文件路径:source Example.sh
    只要脚本文件路径没有写错,sh或source命令都可以直接执行该脚本,但直接访问脚本路径的方式有点特殊。
    使用直接访问脚本路径的方式提示出现错误,权限不足:
    [root@linuxprobe ~]# ./Example.sh
    bash: ./Example.sh: Permission denied
    需要为脚本设置可执行权限后才能顺利运行 :
    [root@linuxprobe ~]# chmod u+x Example.sh
    再来运行就没有问题了:
    [root@linuxprobe ~]# ./Example.sh

    接受用户的参数

    Shell脚本为了能够让用户更灵活的完成工作需求,应该有办法接收用户输入的参数,像上面的脚本的写法真的很不灵活。
    您在执行命令时的参数是不是像这样使用:“命令名 参数1 参数2 参数3”,所以其实在可执行文件中已经内设了接收用户参数的位置变量。

    不光如此,还有这些已经被定义好的Shell预定义变量:

    变量 功能
    $0 当前执行Shell脚本的程序名。
    $1-9,${10},${11}…… 参数的位置变量。
    $# 一共有多少个参数。
    $* 所有位置变量的值。
    $? 判断上一条命令是否执行成功,0为成功,非0为失败。

    好的~来动手完成一个可以接收用户参数的Shell脚本吧:
    [root@linuxprobe ~]# vim Example.sh

    #!/bin/bash
    echo "当前脚本名称为$0"
    echo "总共有$#个参数,分别是$*。"
    echo "第1个参数为$1,第5个为$5。"
    

    使用sh命令来执行脚本,并附带6个参数:
    [root@linuxprobe ~]# sh Example.sh one two three four five six
    当前脚本名称为2nd.sh
    总共有6个参数,分别是one two three four five six。
    第1个参数为one,第5个为five。

    判断用户参数

    Shell脚本有时还要判断用户输入的参数,例如像mkdir命令一样,当目录不存在则创建,若已经存在则报错,条件测试语句能够测试特定的表达式是否成立,当条件成立时返回值为0,否则返回其他数值。
    测试语句格式 :[ 条件表达式 ] 条件表达式两边有空格
    细分测试语句有:

    • 文件测试、
    • 逻辑测试、
    • 整数值比较、
    • 字符串比较。
      文件测试:[ 操作符 文件或目录名]
    操作符 作用
    -d 测试是否为目录。
    -e 测试文件或目录是否存在。
    -f 判断是否为文件。
    -r 测试当前用户是否有权限读取。
    -w 测试当前用户是否有权限写入。
    -x 测试当前用户是否有权限执行。

    测试/etc/fstab是否为目录:
    [root@linuxprobe ~]# [ -d /etc/fstab ]
    显示上一条命令的返回值,非0则为失败,即不是目录:
    [root@linuxprobe ~]# echo $?
    1
    测试/etc/fstab是否为文件:
    [root@linuxprobe ~]# [ -f /etc/fstab ]
    显示上一条命令的返回值为0,即fstab是文件:
    [root@linuxprobe ~]# echo $?

    符号&&代表逻辑上的”与“,当前面的命令执行成功才会执行后面的命令,判断/dev/cdrom设备是否存在,若存在则输出Exist:
    [root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
    Exist
    逻辑测试:[ 表达式1 ] 操作符 [ 表达式2 ]

    操作符 作用
    && 逻辑的与,"而且"的意思。
    II 逻辑的或,"或者"的意思。
    ! 逻辑的否。

    USER变量是当前登陆的用户名:
    [root@linuxprobe ~]# echo $USER
    root
    若当前登陆的用户不是root,则输出user,执行后结果为空:
    [root@linuxprobe ~]# [ $USER != root ] && echo "user"
    登入用户linuxprobe,再来测试便输出了user字样:
    [root@linuxprobe ~]# su linuxprobe -
    [linuxprobe@linuxprobe root]$ [ $USER != root ] && echo "user"
    user
    换回root用户后用加强版的判断语句,非root用户则输出user,若是root则直接输出root:
    [root@linuxprobe ~]# [ $USER != root ] && echo "user" || echo "root"
    root
    这里请读者思考下&&与||的逻辑含义,因为前面的&&不成立,所有后面的||才会执行。

    整数值比较:[ 整数1 操作符 整数2 ]

    操作符 作用
    -eq 判断是否等于
    -ne 判断是否不等于
    -gt 判断是否大于
    -lt 判断是否小于
    -le 判断是否等于或小于
    -ge 判断是否大于或等于

    比较10是否大于10:
    [root@linuxprobe ~]# [ 10 -gt 10 ]
    显示上一条命令执行失败,10不大于10:
    [root@linuxprobe ~]# echo $?
    1
    比较10是否等于10:
    [root@linuxprobe ~]# [ 10 -eq 10 ]
    显示上一条命令执行成功,10等于10:
    [root@linuxprobe ~]# echo $?
    0

    获取当前可用的内存量,并将此值赋值给变量FreeMem,逐个解释下吧~
    首先用free -m查看以m为单位的内存使用情况,
    然后grep cache:过滤出剩余内存的行,
    最后用awk ‘{print $3}’过滤只保留第三列,而FreeMem=语句则表示执行里面的语句后赋值给变量。
    [root@linuxprobe ~]# FreeMem=free -m | grep cache: | awk '{print $3}'
    验证变量是否已经获得可用内存量:
    [root@linuxprobe ~]# echo $FreeMem
    609
    判断此值是否小与1024(单位是M),若小于则提示内存不足:
    [root@linuxprobe ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
    Insufficient Memory

    字符串比较:[ 字符串1 操作符 字符串2 ]

    操作符 作用
    = 比较字符串内容是否相同。
    != 比较字符串内容是否不同。
    -z 判断字符串内容是否为空。

    判断String变量是否为空值:
    [root@linuxprobe ~]# [ -z $String ]
    上一条命令执行成功,说明变量String确实为空值:
    [root@linuxprobe ~]# echo $?
    0
    输出当前的系统语言:
    [root@linuxprobe ~]# echo $LANG
    en_US.UTF-8
    判断当前的系统语言是否为英文,否则输出“不是英语”:
    [root@linuxprobe ~]# [ $LANG != "en.US" ] && echo "Not en.US"
    Not en.US

    条件测试语句

    条件测试语句能够让Shell脚本根据实际工作灵活调整工作内容,例如判断系统的状态后执行指定的工作,或创建指定数量的用户,批量修改用户密码,这些都可以让Shell脚本通过条件测试语句完成。
    if条件语句
    if条件语句分为单分支结构、双分支结构、多分支结构,复杂度逐级上升,但却可以让Shell脚本更加的灵活。
    首先来说单分支结构,仅用if、then、fi关键词组成,只在条件成立后执行。

    image.png

    条件测试语句

    条件测试语句能够让Shell脚本根据实际工作灵活调整工作内容,例如判断系统的状态后执行指定的工作,或创建指定数量的用户,批量修改用户密码,这些都可以让Shell脚本通过条件测试语句完成。
    if条件语句
    if条件语句分为单分支结构、双分支结构、多分支结构,复杂度逐级上升,但却可以让Shell脚本更加的灵活。
    首先来说单分支结构,仅用if、then、fi关键词组成,只在条件成立后执行

    image.png
    单分支if语句:判断目录是否存在,若不存在则自动创建。

    语法规则
    1.if后要有空格
    2.[ ] 中括号的开头和结尾要有空格!

    1. [ $1-eq"root" ]中括号中的$1和-eq和"root"之间没有空格
    
           #!/bin/bash     
            DIR="/home/xuwenhui/test"   
            if [ ! -e $DIR ]   
            then   
                  mkdir -p $DIR 
            fi   
    

    双分支结构是由if、then、else、fi关键词组成,做条件成立或条件不成立的判断。

    image.png
    继续举例
    #!/bin/bash   
    DIR="/home/xuwenhui/test" #定变量
    if [ ! -e $DIR ]  #判断是否有此目录
    then
            mkdir -p $DIR
            echo "$DIR is created!"
    else
            echo "There is a $DIR dir!"
    fi
    

    多分支结构相对就比较复杂了,是由if、then、else、elif、fi关键词组成,根据多种条件成立的可能性执行不同的操作。

    image.png

    继续继续举例 判断等级

    #!/bin/bash
    read -p "Enter your score(0-100):" GRADE
    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
    echo "$GRADE is Excellent"
    elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
    echo "$GRADE is Pass"
    else echo "$GRADE is Fail" 
    fi
    

    for循环

    for条件语句会先读取多个不同的变量值,然后逐一执行同一组命令

    image.png
    for条件语句:从列表文件中读取主机地址,逐个测试是否在线。
    首先创建主机地址列表:
    [root@localhost ~]# vim ipadds.txt
    192.168.10.10
    192.168.10.11
    192.168.10.12
    这个脚本可以参考前面双分支if语句———从ipadds.txt中读取主机地址后赋值给HLIST变量后逐个ping列表中的主机IP地址测试主机是否在线:
    [root@localhost ~]# vim Example.sh
    #!/bin/bash
    HLIST=$(cat ~/ipadds.txt)
    for IP in $HLIST
    do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
    if [ $? -eq 0 ] ; then
    echo "Host $IP is up."
    else
    echo "Host $IP is down."
    fi
    done
    

    while 循环

    while条件语句用于重复测试某个条件,当条件成立时则继续重复执行。

    image.png

    while条件语句:随机生成一个0-999的整数,判断并提示用户输入的值过高或过低,只有当用户猜中才结束程序。
    脚本中的$RANDOM是一个随机变量,用于在%1000后会得到一个介于0-999的整数后赋值给PRICE变量,while后面的true代表该循环会永久循环执行:

    #!/bin/bash
    PRICE=$(expr $RANDOM % 1000)
    TIMES=0
    echo "商品实际价格为0-999之间,猜猜看是多少?"
    while true
    do
    read -p "请输入你猜测的价格数目:" INT
    let TIMES++
    if [ $INT -eq $PRICE ] ; then
    echo "恭喜你答对了,实际价格是 $PRICE"
    echo "你总共猜测了 $TIMES 次"
    exit 0
    elif [ $INT -gt $PRICE ] ; then
    echo "太高了!"
    else
    echo "太低了!"
    fi
    done
    

    动手试试运行Shell脚本吧,每次RANDOM变量的值都是随机的

    case循环

    case条件语句可以依据变量的不同取值,分别执行不同的命令动作。

    image.png
    case条件语句:提示用户输入一个字符,判断该字符是字母、数字或特殊字母。
    提示用户输入一个字符并将其赋值给变量KEY,判断变量KEY为何种字符后分别输出是字母、数字还是其他字符:
    [root@linuxprobe ~]# vim Example.sh
    #!/bin/bash
    read -p "请输入一个字符,并按Enter键确认:" KEY
    case "$KEY" in
    [a-z]|[A-Z])
    echo "您输入的是 字母。"
    ;;
    [0-9])
    echo "您输入的是 数字。"
    ;;
    *)
    echo "您输入的是 空格、功能键或其他控制字符。"
    esac
    
    

    相关文章

      网友评论

        本文标题:5.vi编辑器以及简单的SHELL脚本

        本文链接:https://www.haomeiwen.com/subject/jxrgpxtx.html