zoukankan      html  css  js  c++  java
  • Vim编辑器与Shell命令脚本

    章节简述:

    本章节将教给您如何使用Vim编辑器来编写文档、配置主机名称、网卡参数以及yum仓库 ,熟练使用各个模式和命令快捷键。

    我们可以通过Vim编辑器将Linux命令放入合适的逻辑测试语句(ifforwhilecase)后最终写出简单实用的Shell脚本。

    还可以通过使用at命令或配置Crontab计划任务服务让系统自动按时工作,让日常工作更加的高效自动化,一劳永逸哦~

    4.1 了解Vim文本编辑器

    在Linux系统中配置应用服务,实际上就是在修改它的配置文件(配置文件可能有多个,其中包含不同的参数),而且日常工作中也一定免不了编写文档的事情吧,这些都是要通过文本编辑器来完成的。

    在热门Linux操作系统中都会默认安装一款超好用的文本编辑器——名字叫“vim”,vimvi编辑器的升级版。

    Vim能够得到这么多厂商与用户的认可,原因就是在Vim编辑器中有三种模式——命令模式末行模式编辑模式,分别又有多种不同的命令快捷键组合,很大的提高了工作效率,用习惯后会觉得非常的顺手。要想在文本操作时更加高效率,我们必需先搞清Vim编辑器的三种模式的操作不同与切换方法。

    命令模式:控制光标移动,可对文本进行删除、复制、粘贴等工作。

    输入模式:正常的文本录入。

    末行模式:保存、退出与设置编辑环境。

    记住每次运行vim编辑器后都默认是“命令模式”,需要先进入到“输入模式”后再进行编写文档的工作,而每次编辑完成需先返回到“命令模式”后再进入“末行模式”对文本的保存或退出操作。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    这里为大家总结出了最常用的快捷键命令,读者尽量记一下,忘记了来查也可以,至于“输入模式”则没有特殊技巧。

    vim编辑器的命令模式中常用的快捷键

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

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

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

    需要读者注意的两点:

    1.在命令模式与末行模式中,所有的快捷键参数均区分大小写。

    2.在末行模式中所有快捷键参数前都有一个冒号":"。

    4.1.1 编写简单文档

    现在动手编写一个文档吧、我会把每个步骤和按键尽量都标注出来,如果命令忘记了就回到上面小节再看看吧~超简单!

    请您按照下面的幻灯片逐步操作,可点击图片两侧箭头或下方小圆点“○”切换步骤。

    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第1步:创建文档。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第2步:敲击字母“a”,进入输入模式。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第3步:输入一行字符。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第4步:敲击[ESC]返回到命令模式。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第5步:敲击“:wq”,保存并退出。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第6步:查看文档的内容。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第7步:编辑文件。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第8步:敲击字母“o”,进入到输入模式。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第9步:输入一行字符。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第10步:返回命令模式后尝试“:q”退出不保存。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第11步:提示内容已被修改,不能退出。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第12步:敲击“:q!”后强制退出不保存。
    • 第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
      第13步:查看文档,发现第二句确实没保存。
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    10. 10
    11. 11
    12. 12
    13. 13
    4.1.2 配置主机名称

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

    第1步:使用vim命令修改"/etc/hostname"主机名称文件。

    第2步:将原始主机名称删除后追加"linuxprobe.com"。

    第3步:保存退出并用hostname命令检查是否修改成功。

    使用vim命令编辑主机名称文件后末行模式执行:wq!后即可保存退出:

    [root@linuxprobe ~]# vim /etc/hostname
    linuxprobe.com
    

    使用hostname命令查看当前的主机名称:

    [root@linuxprobe ~]# hostname
    linuxprobe.com
    
    4.1.3 配置网卡信息

    既然已经会用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"目录中(该目录存放着网卡的配置文件)。

    第2步:使用vim命令修改文件"ifcfg-eno16777736"。

    第3步:逐项写入配置参数,并保存退出。

    第4步:重新启动网卡命令:"systemctl restart network"。

    第5步:通过ping命令测试网卡信息是否生效。

    切换到网卡配置文件所在的目录:

    [root@linuxprobe ~]# cd /etc/sysconfig/network-scripts/
    

    编辑网卡配置文件并填入下面的信息:

    [root@linuxprobe network-scripts]# vim ifcfg-eno16777736
    TYPE=Ethernet
    BOOTPROTO=static
    NAME=eno16777736
    ONBOOT=yes
    IPADDR=192.168.10.10
    NETMASK=255.255.255.0
    GATEWAY=192.168.10.1
    DNS1=192.168.10.1
    

    重新启动网卡,正常情况不会提示信息:

    [root@linuxprobe network-scripts]# systemctl restart network
    

    不错哦,成功的ping通证明网卡配置正确并生效了:

    [root@linuxprobe network-scripts]# ping 192.168.10.10
    PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
    64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.081 ms
    64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.083 ms
    64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.059 ms
    64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.097 ms
    ^C
    --- 192.168.10.10 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 0.059/0.080/0.097/0.013 ms
    
    4.1.4 配置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!
    

    出现问题?大胆提问!

    因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

    您可以将报错的屏幕截图与自己的操作过程帖到“会员互助问答区”,一般问题都会在24小时内被解决。

    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    4.2 了解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
    4.2.1 编译简单的脚本

    Shell脚本的编写要使用到Vim文本编辑器,按照命令的执行顺序依次编写,每行写一条Linux命令。并且一个完整的Shell脚本则应该包括“脚本声明”、“注释信息”和“可执行语句”。

    脚本声明(#!):告知系统用何种shell来解释。

    注释信息(#):对可执行语句或程序功能做介绍,可以不写。

    可执行语句:执行的具体命令。

    先来编写一个简单的Shell脚本吧,功能是显示当前的工作路径并列出当前目录下的所有文件与属性。

    [root@linuxprobe ~]# vim Example.sh
    #!/bin/bash
    #For Example BY linuxprobe.com
    pwd
    ls -al

    原来编写Shell脚本如此的简单~执行脚本有三种方法:

    脚本文件路径:./Example.sh

    sh脚本文件路径:sh Example.sh

    source脚本文件路径:source Example.sh

    只要脚本文件路径没有写错,shsource命令都可以直接执行该脚本,但直接访问脚本路径的方式有点特殊。

    使用直接访问脚本路径的方式提示出现错误,权限不足:

    [root@linuxprobe ~]# ./Example.sh
    bash: ./Example.sh: Permission denied
    

    需要为脚本设置可执行权限后才能顺利运行:

    [root@linuxprobe ~]# chmod u+x Example.sh
    

    再来运行就没有问题了:

    [root@linuxprobe ~]# ./Example.sh
    /root/Desktop
    total 8
    drwxr-xr-x. 2 root root 23 Jul 23 17:31 .
    dr-xr-x---. 14 root root 4096 Jul 23 17:31 ..
    -rwxr--r--. 1 root root 55 Jul 23 17:31 Example.sh
    
    4.2.2 接收用户的参数

    Shell脚本为了能够让用户更灵活的完成工作需求,应该有办法接收用户输入的参数,像上面的脚本的写法真的很不灵活。

    您在执行命令时的参数是不是像这样使用:“命令名 参数1 参数2 参数3”,所以其实在可执行文件中已经内设了接收用户参数的位置变量。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
    不光如此,还有这些已经被定义好的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
    当前脚本名称为Example.sh
    总共有6个参数,分别是one two three four five six。
    第1个参数为one,第5个为five。
    
    4.2.3 判断用户的参数

    Shell脚本有时还要判断用户输入的参数,例如像mkdir命令一样,当目录不存在则创建,若已经存在则报错,条件测试语句能够测试特定的表达式是否成立,当条件成立时返回值为0,否则返回其他数值。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    细分测试语句有:文件测试逻辑测试整数值比较字符串比较

    文件测试:[ 操作符 文件或目录名]

    操作符 作用
    -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 $?
    0
    

    符号&&代表逻辑上的"",当前面的命令执行成功才会执行后面的命令,判断/dev/cdrom设备是否存在,若存在则输出Exist:

    [root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
    Exist
    

    逻辑测试:[ 表达式1 ] 操作符 [ 表达式2 ]

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

    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
    

    出现问题?大胆提问!

    因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

    您可以将报错的屏幕截图与自己的操作过程帖到“会员互助问答区”,一般问题都会在24小时内被解决。

    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    4.3 条件测试语句

    条件测试语句能够让Shell脚本根据实际工作灵活调整工作内容,例如判断系统的状态后执行指定的工作,或创建指定数量的用户,批量修改用户密码,这些都可以让Shell脚本通过条件测试语句完成。

    if条件语句

    if条件语句分为单分支结构、双分支结构、多分支结构,复杂度逐级上升,但却可以让Shell脚本更加的灵活。

    首先来说单分支结构,仅用ifthenfi关键词组成,只在条件成立后执行。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

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

    编写Shell脚本并写入下面的语句:

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

    执行后默认没有回显,读者可动手添加echo语句显示创建过程:

    [root@linuxprobe ~]# sh Example.sh
    

    查看该目录是否被创建:

    [root@linuxprobe ~]# ls -d /media/cdrom
    /media/cdrom
    

    双分支结构是由ifthenelsefi关键词组成,做条件成立或条件不成立的判断。

    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    双分支if语句:判断指定主机能否ping通,根据返回结果分别给予提示或警告。
    为了减少用户的等待时间,需要为ping命令追加-c参数代表发送数据包的个数,-i代表每0.2秒发一个数据包,-W则为3秒即超时。而$1为用户输入的第一个参数(IP地址),$?为上一条命令的执行结果,判断是否等于0(即成功)。

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

    给予脚本可执行权限,否则请用sh或source命令执行:

    [root@linuxprobe ~]# chmod u+x Example.sh
    

    参数为要检测的主机IP地址,根据返回值判断为up:

    [root@linuxprobe ~]# ./Example.sh 192.168.10.10
    Host 192.168.10.10 is up.
    

    根据ping命令的执行结果判断主机出现网络故障。

    [root@linuxprobe ~]# ./Example.sh 192.168.10.20
    Host 192.168.10.20 is down.
    

    多分支结构相对就比较复杂了,是由ifthenelseeliffi关键词组成,根据多种条件成立的可能性执行不同的操作。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    多分支if语句:判断用户输入的分数在那个区间内,然后判定为优秀、合格或不合格。

    read命令用于将用户的输入参数赋值给指定变量,格式为:"read -p [提示语句] 变量名"。
    使用read命令让用户为GRADE变量赋值,判断分数必需同时满足大于85且小于100才输出Excellent,判断分数必需同时满足大于70且小于84才输出Pass,其余所有的情况均会输出Fail。

    [root@linuxprobe ~]# vim Example.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
    

    给予脚本可执行权限,否则请用sh或source命令执行:

    [root@linuxprobe ~]# chmod u+x Example.sh
    

    输入88分,满足第一判断语句,所以输出Excellent:

    [root@linuxprobe ~]# ./Example.sh
    Enter your score(0-100):88
    88 is Excellent
    

    输入80分,满足第二判断语句,所以输出Pass:

    [root@linuxprobe ~]# ./Example.sh Enter your score(0-100):80
    80 is Pass
    

    输入30与200分都属于其他情况,所以输出Fail:

    [root@linuxprobe ~]# ./Example.sh  Enter your score(0-100):30
    30 is Fail
    [root@linuxprobe ~]# ./Example.sh Enter your score(0-100):200
    200 is Fail
    

    请您动手在上面Shell脚本中添加判断语句,将所有小于0分或大于100分的输入都予以警告。

    for条件语句

    for条件语句会先读取多个不同的变量值,然后逐一执行同一组命令。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
    for条件语句:从列表文件中读取用户名,逐个创建用户并将密码设置。

    创建用户名称列表文件:

    [root@linuxprobe ~]# vim users.txt
    andy
    barry
    carl
    duke
    eric
    george
    

    Shell脚本提示用户输入要设置的密码并赋值给PASSWD变量,从users.txt文件中读入用户名并赋值给UNAME变量,而查看用户的信息都重定向到/dev/null文件,不显示到屏幕。

    [root@linuxprobe ~]# vim Example.sh
    #!/bin/bash
    read -p "Enter The Users Password : " PASSWD
    for UNAME in `cat users.txt`
    do
    id $UNAME &> /dev/null
    if [ $? -eq 0 ]
    then
    echo "Already exists"
    else
    useradd $UNAME &> /dev/null
    echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
    if [ $? -eq 0 ]
    then
    echo "Create success"
    else
    echo "Create failure"
    fi
    fi
    done
    

    执行批量创建用户的Shell脚本程序,输入为用户设定的密码口令,检查脚本是否为我们完成创建用户的动作:

    [root@linuxprobe ~]# source Example.sh
    Enter The Users Password : linuxprobe
    Create success
    Create success
    Create success
    Create success
    Create success
    Create success
    [root@linuxprobe ~]# tail -6 /etc/passwd
    andy:x:1001:1001::/home/andy:/bin/bash
    barry:x:1002:1002::/home/barry:/bin/bash
    carl:x:1003:1003::/home/carl:/bin/bash
    duke:x:1004:1004::/home/duke:/bin/bash
    eric:x:1005:1005::/home/eric:/bin/bash
    george:x:1006:1006::/home/george:/bin/bash
    

    这个Shell脚本还存在一个小小的遗憾,它只会输出帐号创建成功或失败,但没有指明是那个帐号,这个功能请读者动手添加下,记得是要用$UNAME变量哦。

    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
    [root@linuxprobe ~]# ./Example.sh
    Host 192.168.10.10 is up.
    Host 192.168.10.11 is down.
    Host 192.168.10.12 is down.
    
    while条件语句

    while条件语句用于重复测试某个条件,当条件成立时则继续重复执行。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    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变量的值都是随机的:

    [root@linuxprobe ~]# chmod u+x Example.sh
    [root@linuxprobe ~]# ./Example.sh
    商品实际价格为0-999之间,猜猜看是多少?
    请输入你猜测的价格数目:500
    太低了!
    请输入你猜测的价格数目:800
    太高了!
    请输入你猜测的价格数目:650
    太低了!
    请输入你猜测的价格数目:720
    太高了!
    请输入你猜测的价格数目:690
    太低了!
    请输入你猜测的价格数目:700
    太高了!
    请输入你猜测的价格数目:695
    太高了!
    请输入你猜测的价格数目:692
    太高了!
    请输入你猜测的价格数目:691
    恭喜你答对了,实际价格是 691
    你总共猜测了 9 次
    
    case条件语句

    case条件语句可以依据变量的不同取值,分别执行不同的命令动作。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。
    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
    [root@linuxprobe ~]# chmod u+x Example.sh
    [root@linuxprobe ~]# ./Example.sh
    请输入一个字符,并按Enter键确认:6
    您输入的是 数字。
    [root@linuxprobe ~]# ./Example.sh
    请输入一个字符,并按Enter键确认:p
    您输入的是 字母。
    [root@linuxprobe ~]# ./Example.sh
    请输入一个字符,并按Enter键确认:^[[15~
    您输入的是 空格、功能键或其他控制字符。
    
    4.4 计划任务服务

    有经验的系统运维工程师能够让系统自动化运行,无需人工的干预就可以让各个服务、命令在指定的时间段运行、停止。

    实际上这些操作都是由系统的计划任务功能完成的,而计划任务又分为“一次性”与“长期性”之分,可以理解为:

    一次性计划任务:今晚11点30分开启网站服务(例如新网站的公测)

    长期性计划任务:每周1、3、5的凌晨3点25分将/home/wwwroot目录打包备份为backup.tar.gz

    先来讲一次性任务吧,它是由atd服务/进程来实现的,计划的管理操作是"at"命令,具体的可用参数如下:

    参数 作用
    at <时间> 安排一次性任务
    atq或at -l 查看任务列表
    at -c 序号 预览任务与设置环境
    atrm 序号 删除任务


    一般用at命令创建计划任务有交互式与非交互式两种方法,先来看看交换式的方法,(输完成后敲击Ctrl+d来保存退出):

    [root@linuxprobe ~]# at 23:30
    at > systemctl start httpd
    at >
    job 3 at Mon Apr 27 23:30:00 2015
    [root@linuxprobe ~]# atq
    3 Mon Apr 27 23:30:00 2015 a root
    

    直接用echo语句将要执行的命令传送给at命令:

    [root@linuxprobe ~]# echo "systemctl start httpd" | at 23:30
    job 4 at Mon Apr 27 23:30:00 2015
    [root@linuxprobe ~]# atq
    3 Mon Apr 27 23:30:00 2015 a root
    4 Mon Apr 27 23:30:00 2015 a root
    

    删除的时候只需要用atrm命令与任务编号就可以啦~

    [root@linuxprobe ~]# atrm 3
    [root@linuxprobe ~]# atrm 4
    [root@linuxprobe ~]# atq
    

    对于创建长期可循环的计划任务,则要用到cron服务啦,具体使用方法如下:

    创建、编辑计划任务:crontab -e [-u 用户名]

    查看计划任务:crontab -l [-u 用户名]
    删除计划任务:crontab -r [-u 用户名]

    其中在创建、编辑计划任务时有个固定的格式,请读者们一定要记住。
    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    字段 说明
    分钟 取值为从0到59之间的整数
    小时 取值为从0到23之间的任意整数
    日期 取值为1到31之间的任意整数
    月份 取值为1到12之间的任意整数
    星期 取值为0到7之间的任意整数,其中0与7均为星期日
    命令 要执行的命令或程序脚本

    需要用cron计划任务实现的功能:"每周1、3、5的凌晨3点25分将/home/wwwroot目录打包备份为backup.tar.gz"

    编辑root用户自己的计划任务:

    [root@linuxprobe ~]# crontab -e
    no crontab for root - using an empty one
    crontab: installing new crontab
    

    使用"crontab -l"命令查看计划任务的内容:

    [root@linuxprobe ~]# crontab -l
    25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
    

    如果想对某个用户设置多个计划任务,则可直接用"crontab -e"命令将命令逐条添加即可,让计划任务自动在每周1-5的凌晨1点打包网站目录后自动清除/tmp目录下的所有文件::

    [root@linuxprobe ~]# crontab -e
    crontab: installing new crontab
    [root@linuxprobe ~]# crontab -l
    25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
    0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
    

    出现问题?大胆提问!

    因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

    您可以将报错的屏幕截图与自己的操作过程帖到“会员互助问答区”,一般问题都会在24小时内被解决。

    第4章 Vim编辑器与Shell命令脚本。第4章 Vim编辑器与Shell命令脚本。

    本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

    1:Vim编辑器的三种模式分别是?

    答案:命令模式、末行模式、编辑模式(也叫输入模式)。

    2:从输入模式切换到末行模式的操作是?

    答案:先敲击[ECS]退回到命令模式后敲击冒号":"。

    3:一个完整的Shell脚本应该包括什么?

    答案:一个完整的Shell脚本应该包括“脚本声明”、“注释信息”和“可执行语句”。

    4:分别解释Shell脚本中$0与$1变量的作用。

    答案:$0代表Shell脚本的名称,$1代表该程序接收的第一个参数。

    5:如果需要依据用户的输入参数执行不同的操作,最方便的条件测试语句是?

    答案:case条件语句最方便。

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/tianfen/p/5620793.html
Copyright © 2011-2022 走看看