章节简述:

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

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

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

4.1 了解Vim文本编辑器

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

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

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.在末行模式中所有快捷键参数前都有一个冒号":"。

4.1.1 编写简单文档

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

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

  • 第1步:创建文档。
  • 第2步:敲击字母“a”,进入输入模式。
  • 第3步:输入一行字符。
  • 第4步:敲击[ESC]返回到命令模式。
  • 第5步:敲击“:wq”,保存并退出。
  • 第6步:查看文档的内容。
  • 第7步:编辑文件。
  • 第8步:敲击字母“o”,进入到输入模式。
  • 第9步:输入一行字符。
  • 第10步:返回命令模式后尝试“:q”退出不保存。
  • 第11步:提示内容已被修改,不能退出。
  • 第12步:敲击“:q!”后强制退出不保存。
  • 第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.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”,所以其实在可执行文件中已经内设了接收用户参数的位置变量。

不光如此,还有这些已经被定义好的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,否则返回其他数值。

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

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

操作符 作用
-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.3 条件测试语句

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

if条件语句

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

首先来说单分支结构,仅用ifthenfi关键词组成,只在条件成立后执行。

单分支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关键词组成,做条件成立或条件不成立的判断。

双分支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关键词组成,根据多种条件成立的可能性执行不同的操作。

多分支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条件语句会先读取多个不同的变量值,然后逐一执行同一组命令。

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条件语句用于重复测试某个条件,当条件成立时则继续重复执行。

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条件语句可以依据变量的不同取值,分别执行不同的命令动作。

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 用户名]

其中在创建、编辑计划任务时有个固定的格式,请读者们一定要记住。

字段 说明
分钟 取值为从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小时内被解决。

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

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

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

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

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

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

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

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

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

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

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

Vim编辑器与Shell命令脚本的更多相关文章

  1. 4.Vim编辑器与Shell命令脚本

    第4章 Vim编辑器与Shell命令脚本 章节简述: 本章首先讲解如何使用Vim编辑器来编写.修改文档,然后通过逐个配置主机名称.系统网卡以及Yum软件仓库参数文件等实验,帮助读者加深Vim编辑器中诸 ...

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

    章节简述: 本章节将教给您如何使用Vim编辑器来编写文档.配置主机名称.网卡参数以及yum仓库 ,熟练使用各个模式和命令快捷键. 我们可以通过Vim编辑器将Linux命令放入合适的逻辑测试语句(if. ...

  3. Linux 就该这么学 CH04 VIM编辑器和Shell命令脚本

    0 概述 1 Vim编辑器 在linux 中一切都是文件,而配置一个服务就是修改其配置文件的参数. vim 编辑器有三种模式:命令模式,末行模式和编辑模式. 命令模式:控制光标移动,对文件进行操作. ...

  4. Linux就该这么学28期——Day05 vim编辑器与Shell命令脚本 (yum配置 网卡配置)

    vim 三种模式: 命令模式 按行操作 dd 剪切.删除 5dd dG   全删 yy 复制光标所在行 p 粘贴 u 撤销操作 / 搜索 /ab n  下一个 N   上一个 输入模式 a 当前光标处 ...

  5. 《Linux就该这么学》培训笔记_ch04_Vim编辑器与Shell命令脚本

    <Linux就该这么学>培训笔记_ch04_Vim编辑器与Shell命令脚本 文章最后会post上书本的笔记照片. 文章主要内容: Vim编辑器 Shell脚本 流程控制语句 if语句 f ...

  6. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...

  7. vim之执行shell命令

    vim中执行shell命令,有以下几种形式 (1) :!command 不退出vim, 并执行shell命令command, 将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 (2)   ...

  8. Vim编辑器与shell脚本

      目录                                                          Vim文本编辑器 Shell脚本 Shell编程变量 流程控制语句 计划任务 ...

  9. vim中执行shell命令

    1):!command   不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容   例如   :!ls -l   特别的可以运行:!bas ...

随机推荐

  1. node-webkit入门

    node-webkit入门   一.简介 node-webkit 是一个基于chromium与node.js的应用程序运行器,它允许开发者使用web技术编写桌面程序.通过Node.js和WebKit技 ...

  2. IT团队管理

    如果在IT项目实施中选出最难解决的几个问题,那么管理问题一定名列前茅.在管理问题中,团队管理又是其中的难点.一个项目管理的 好坏,很大程度就体现在团队的建设和管理上.团队管理涉及到管理学.心理学和哲学 ...

  3. iOS推送服务细节回顾

    iOS推送服务细节回顾 之前在做推送功能时候,就总结过一系列证书的制作,OC代码实现和服务器搭建等经验.又过了一段时间了,前前后后对推送服务做了多次的完善和优化,有iOS客户端的,还有本地服务器端的. ...

  4. 企业架构与建模之Archimate视图和视角

    企业架构与建模之Archimate视图和视角 3. ArchiMate的视角与视图 创建.维护一个企业架构是一件非常复杂繁琐的事情,因为这项工作需要面对许多背景.利益各异的干系人,对他们所关注的问题进 ...

  5. 对类sizeof的时候

    sizeof一个类的时候,都什么会被计算?静态成员会被计算进来么?如果这是一个子类,它的父类成员会被计算么? #include<stdio.h> #include<string.h& ...

  6. 判断UA这种事不能说的太明。

    [微博] Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; GT-I9502 Build/JDQ39) AppleWebKit/534.30 (KHTML, l ...

  7. 使用brew安装软件

    使用brew安装软件 brew 又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令, 非常方便 brew类似ubuntu系统下的apt- ...

  8. java实现验证码

    第一步:在web.xml中配置servlet <servlet> <servlet-name>ImageServlet</servlet-name> <ser ...

  9. JIT动态编译器的原理与实现之Interpreter3

    JIT动态编译器的原理与实现之Interpreter(解释器)的实现(三) 接下来,就是要实现一个虚拟机了.记得编码高质量的代码中有一条:不要过早地优化你的代码.所以,也本着循序渐进的原则,我将从实现 ...

  10. hdu 1253 胜利大逃亡(BFS)

    题目链接:点击链接 三维的BFS,刚开始一直超内存,超无语......  改了n多次终于AC了 #include <iostream> #include <stdio.h> # ...