您的位置:首页 > 运维架构 > Shell

Vim编辑器与Shell命令脚本

2020-07-14 05:46 211 查看

Vim编辑器与Shell命令脚本

  • 编写Shell脚本
  • Vim文本编辑器

    Vim文本编辑器的三种工作模式

    Vim中常用的命令

    命令模式中常用命令

    末行模式中常用命令

    配置主义名称

    配置网卡信息

    配置Yum软件仓库

    编写Shell脚本

    1.Vim文本编辑器的三种工作模式:
    - **命令模式:**控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
    - **输入模式:**正常的文本录入。
    - **末行模式:**保存或退出文档,以及设置编辑环境。

    2.Vim中常用的命令:
    命令模式中常用命令:

    命令 作用
    a 在光标后面一位切换到输入模式
    i 在光标当前位置切换到输入模式
    o 在光标的下面再创建一个空行
    dd 删除(剪切)光标所在整行
    5dd 删除(剪切)从光标处开始的5行
    yy 复制光标所在整行
    5yy 复制从光标处开始的5行
    n 显示搜索命令定位到的下一个字符串
    N 显示搜索命令定位到的上一个字符串
    u 撤销上一步的操作
    p 将之前删除(dd)或复制(yy)过得数据粘贴到光标后面

    末行模式中常用命令:

    命令 作用
    :w 保存
    :q 退出
    :q! 强制退出(放弃对文档的修改内容)
    :wq! 强制保存退出
    :set nu 显示行号
    :set nonu 不显示行号
    :命令 执行该命令
    :整数 跳转到该行
    : s/one/two 将当前光标所在行的第一个one替换为two
    : s/one/two/g 将当前光标所在行的所有one替换为two
    : %s/one/two/g 将全文中的所有one替换为two
    ?字符串 在文本中从下至上搜索该字符串
    /字符串 在文本中从上至下搜索该字符串

    配置主义名称:
    第一步:使用vim编辑器修改 ”/etc/hostname“ 主机名称文件
    第二步:把原始主机名称删除后追加 ”linuxprobe.com“
    第三步:保存并退出文档,然后使用hostname命令检查是否修改成功。

    配置网卡信息:
    第一步:首先切换到 /etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)
    第二步:使用vim编辑器修改网卡文件ifcfg-eno16777736,逐项写入下面的配置参数并保存退出。
    > 设备类型: 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
    第三步:重启网络服务并测试网络是否联通
    重启网卡命令:

    systemctl restart network

    配置Yum软件仓库
    第一步:进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件)
    第二步:使用vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必须是.repo),逐项写入下面加粗的配置参数并保存退出(不要写后面的中文注释)
    > [rhel-media] : Yum软件仓库唯一标识符,避免与其他仓库冲突
    > name=linuxprobe :Yum软件仓库的名称描述,易于识别仓库用处
    > baseurl=file:///media/cdrom :提供的方式包括FTP(ftp://…)、HTTP(http://…)、本地(file:///…)。
    > enabled=1 : 设置此源是否可用;1为可用,0为禁用
    > gpgcheck=1 : 设置此源是否校验文件;1为校验,0为不校验
    > gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release: 若上面参数开启校验,那么请指定公钥文件地址
    第三步:按照配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab文件中。
    第四部:使用“yum install httpd -y“命令检查Yum软件仓库是否已经可用。

    编写Shell脚本
    Shell脚本命令的工作方式有两种:交互式和批处理。
    > 交互式(Interactive):用户每输入一条命令就立即执行。
    > 批处理(Batch):由用户事先编写好的一个完整的Shell脚本,Shell会一次性执行脚本中诸多命令。

    编写简单的脚本
    举例:一个简单的脚本文件
    首先在终端输入命令:

    vim example.sh

    然后在文件中输入脚本信息:
    #!/bin/bash

    #For Example BY linuxprobe.com

    pwd

    ls -al

    说明:第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本;
    第二行的注释信息(#)是对脚本功能和某些命令的介绍信息;
    第三、四行的可执行语句也就是我们平时执行的Linux命令了。

    接收用户的参数

    变量 作用
    $0 对应的是当前Shell脚本程序的名称
    $# 对应的是总共有几个参数
    $* 对应的是所有位置的参数值
    $? 对应的是显示上一次命令的执行返回值
    $1、$2、$3… 分别对应着第N个位置的参数值

    脚本示例:

    #!/bin/bash

    echo "当前脚本名称为$0"

    echo "总共有$#个参数,分别为$* 。"

    echo "第1个参数为$1,第5个参数为$5"

    判断用户的参数

    • shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。条件测试语法的执行格式如下:
      - 测试语句格式: [ 条件表达式 ]
      - 注意:条件表达式量变各有一个空格
      - 按照测试对象来划分,条件测试语句可以分为4种:

      > 文件测试语句;
      > 逻辑测试语句;
      > 整数值比较语句;
      > 字符串比较语句。

    文件测试语句: 文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体参数如下表:
    文件测试所用的参数:

    运算符 作用
    -d 测试文件是否为目录类型
    -e 测试文件是否存在
    -f 判断是否为一般文件
    -r 测试当前用户是否有权限读取
    -w 测试当前用户是否有权限写入
    -x 测试当前用户是否有权限执行

    示例:
    下面使用文件测试语句来判断/etc/fstab是否为一个目录类型的文件,然后通过shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:

    # [ -d /etc/fstab ]
    # echo $?
    1

    再使用文件测试语句来判断/etc/fstab是否为一般文件,如果返回值为0,则代表文件存在,且为一般文件:

    #[ -f /etc/fstab ]
    #echo $?
    0

    逻辑语句: 用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。
    例如:shell终端中逻辑“与”运算符是**&&**,他表示单签的命令执行成功后才会执行后面的命令,因此可以用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样。

    # [ -e /dev/cdrom ] && echo "Exist"
    Exist

    逻辑“或” 运算符为 ||,表示当前命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量USER来判断当前登录的用户是否为非管理员身份:

    # echo $USER
    root
    # [ $USER = root ] || echo "user"
    # su - linuxprobe
    user

    逻辑“非” 运算符 为 感叹号 ( ! ),他表示把条件测试中的判断结果取相反值。例如:我们现在切换到一个普通用户身份,再判断当前用户是否为一个非管理员的用户。由于判断结果因为两次否定而变成正确,因此会正常地输出预设信息:

    $ exit
    logout
    # [ ! $USER = root ] || echo "administrator"
    administrator

    下面是一个更难的示例: 当前我们登陆的即为管理员用户——root。下面这个示例的执行顺序是,先判断当前用户的USER变量名称是否等于root,然后用逻辑运算符“非”进行取反操作,效果变成了判断当前登录的用户是否为非管理员用户了。最后若条件成立则会根据逻辑“与”运算符输出user字样;或条件不满足则通过逻辑“或”运算符输出root字样,而如果前面的&&不成立才会执行后面的||运算符。

    # [ ! $USER = root ] && echo "user" || echo "root"
    root

    可用的整数比较运算符

    运算符 作用
    -eq 是否等于
    -ne 是否不等于
    -gt 是否大于
    -lt 是否小于
    -le 是否等于或小于
    -ge 是否大于或等于

    示例:
    我们先测试一下10是否大于10以及10是否等于10(通过输出的返回值内容来判断:)

    # [ 10 -gt 10 ]
    # echo $?
    1
    # [ 10 -eq 10]
    # echo $?
    0

    字符串比较语句: 用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)。
    字符串比较常见的比较运算符

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

    示例:
    通过判断String变量是否为空值,进而判断是否定义了这个变量:

    #  [ -z $String ]
    #  echo $?
    0

    再尝试引入逻辑运算符来试一下。当用于保存当前语系的环境变量值LANG不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样:

    #  echo $LANG
    en_US.UTF-8
    #  [ $LANG != "en.US" ] && echo "Not en.US"
    Not en.US

    流程控制语句
    if条件测试语句: if条件测试语句可以让脚本根据实际情况自动执行相应的命令。从技术角度来讲,if语句分为:单分支结构双分支结构多分支结构

    单分支结构:由if、then、fi关键词组成,语法结构如下:

    if 条件测试操作
    then 命令序列
    fi

    或用示例表示为:

    if 目录不存在
    then 创建该目录
    fi

    示例: 下面用单分支的if语句来判断/media/cdrom目录是否存在,若存在就结束条件判断和整个Shell脚本,反之则去创建这个目录:

    [root@linuxprobe ~]#  vim mkcdrom.sh
    #!/bin/bash
    DIR="/media/cdrom"
    if [ ! -e $DIR ]
    then
    mkdir -p $DIR
    fi

    执行脚本:

    [root@linuxprobe~]# bash mkcdrom.sh
    [root@linuxprobe~]# ls -d /media/cdrom
    /media/cdrom

    双分支结构:if语句的双分支结构由if、then、else、fi关键词组成,它进行一次条件匹配判断,如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令,相当于口语“如果……那么……或者……那么……”。
    if语句的双分支结构的语法格式

    if 条件测试操作
    then 命令序列1
    else 命令序列2
    fi

    或者用示例表示为:

    if 能够ping通
    then 提示服务器正常工作
    else 报警服务器出现问题
    fi

    示例:
    下面使用双分支结构的if语句来验证某台主机是否是否在线,然后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息。
    Linux系统中的ping命令:通过-c参数来规范尝试的次数,并使用-i参数定义每个数据包的发送间隔,以及使用-W参数定义等待超时时间。

    [root@linuxprobe ~]# vim chkhost.sh
    #!/bin/bash
    ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
    if [$? -eq 0]
    then
    echo "Host $1 is On-line."
    else
    echo "Host $1 is Off-line."
    fi

    :脚本中$?变量,作用是显示上一次命令的执行返回值。若前面的那条语句成功执行,则$?变量会显示数字0,反之则显示一个非零的数字(可能为1,也可能为2,取决于系统版本)。因此可以使用整数比较运算符来判断$?变量是否为0,从而获知那条语句的最终判断情况。这里使用的我自己的服务器IP地址192.168.44.132,下面验证下脚本的效果:

    [root@linuxprobe ~]# bash chkhost.sh 192.168.44.132
    Host 192.168.44.132 is On-line.
    [root@linuxprobe ~]# bash chkhost.sh 192.168.10.20
    Host 192.168.10.10 is Off-line.

    多分支结构:由if、then、else、elif、fi关键字组成,它进行多次条件匹配判断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令,相当于口语的“如果……那么……如果……那么……”。if条件语句的多分支结构是工作中最常使用的一种条件判断结构,尽管相对复杂但是更加灵活。
    语法格式

    if 条件测试操作1
    then 命令序列1
    elif 条件测试操作2
    then 命令序列2
    else
    命令序列3
    fi

    或使用示例形式表示为:

    if 分数为85~100之间
    then 判为优秀
    elif 分数为70~84之间
    then 判为合格
    else
    判断为不合格
    fi

    示例:
    下面使用多分支if条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Excellent、Pass、Fail等提示信息。在Linux系统中,read是用来读取用户输入信息的命令,能够吧接收到的用户输入信息赋值给后面的指定变量,-p参数用于向用户显示一定的提示信息。

    [root@linuxprobe ~]# vim chkscore.sh
    #!/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

    下面是验证下脚本:

    [root@linuxprobe ~]# bash chkscore.sh
    Enter your score (0-100): 88
    88 is Excellent
    [root@linuxprobe ~]# bash chkscore.sh
    Enter your score (0-100): 80
    80 is Pass
    [root@linuxprobe ~]# bash chkscore.sh
    Enter your score (0-100): 30
    30 is Fail
    [root@linuxprobe ~]# bash chkscore.sh
    Enter your score (0-100): 200
    200 is Fail
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: