Vim编辑器与Shell命令脚本

1.Vim文本编辑器

默认安装在当前所有Linux系统中的文本编辑器,有三种模式:

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

默认为命令模式,需先切换至输入模式再进行文档编写,编写完毕需先返回命令模式,再进入末行模式,执行文档保存或退出。无法直接从输入模式切换至末行模式。

Vim中的常用命令:

  • 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
  • ?字符串 :在文本中从下至上搜索该字符串
  • /字符串 :在文本中从上至下搜索该字符串

1.1 编写简单文档

首先打开文档practice.txt,如果文档不存在,则创建一个临时的输入文件。

这里默认是命令模式,不能随意输入文本,需要按下a、i 或 o 键方能切换至输入模式,其中,a 和 i 分别表示在光标后一位和光标当前位置切换到输入模式,o 则是在光标的下面再创建一个空行,此时敲击 a 键进入输入模式。

然后便可以输入文本。

如果想要保存,必须先按下Esc键退出输入模式 返回命令模式,然后再输入 :wq! 切换到末行模式才能完成保存退出操作。

然后就可以查看文档的内容了

如果要在原有文档后面追加内容,则从命令模式切换至输入模式时,使用 o 键更加方便。

1.2 配置主机名称

为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有IP地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问。在Linux
系统中,主机名大多保存在/etc/hostname文件中,接下来将/etc/hostname文件的内容修改为“linuxprobe.com”,步骤如下。

第1步:使用Vim编辑器修改“/etc/hostname”主机名称文件。

第2步:把原始主机名称删除后追加“linuxprobe.com”。注意,使用Vim编辑器修改主机名称文件后,要在末行模式下执行:wq!命令才能保存并退出文档。

第3步:保存并退出文档,然后使用hostname命令检查是否修改成功。

hostname命令用于查看当前的主机名称,但有时主机名称的改变不会立即同步到系统中,所以如果发现修改完成后还显示原来的主机名称,可重启虚拟机后再行查看

1.3 配置网卡信息

网卡IP地址配置的是否正确是两台服务器是否可以相互通信的前提。在Linux系统中,一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件

在RHEL 7中,网卡配置文件的前缀以ifcfg开始,加上网卡名称共同组成了网卡配置文件的名字,例如ifcfg-eno16777736,ifconfig-ens32 等

配置网卡设备为开机启动,并且IP地址、子网、网关等信息由人工指定,步骤如下:

  1. 首先切换到 /etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)

  2. 使用Vim编辑器修改网卡文件ifcfg-ens32,逐项写入下面的配置参数并保存退出。由于每台设备的硬件及架构是不一样的,可使用ifconfig命令确认网卡的默认名称

TYPE=Ethernet
BOOTPROTO=static
NAME=ens32
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1

  1. 重启网络服务并测试网络是否连通

执行重启网卡设备的命令(在正常情况下不会有提示信息),然后通过ping命令测试网络能否联通。由于在Linux系统中ping命令不会自动终止,因此需要手动按下Ctrl-c键来强行结束进程。

1.4 配置Yum软件仓库

Yum软件仓库的作用是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术。可以把Yum想象成是一个硕大的软件仓库,里面保存有几乎所有常用的
工具,而且只需要说出所需的软件包名称,系统就会自动为您搞定一切。

搭建并配置Yum软件仓库的大致步骤如下所示。

第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件)。

第2步:使用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:若上面参数开启校验,那么请指定公钥文件地址。

 第3步:按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab文件中。

 第4步:使用“yum install httpd -y”命令检查Yum软件仓库是否已经可用。

2.编写Shell脚本

Shell脚本命令的工作方式有两种:交互式和批处理。

交互式(Interactive):用户每输入一条命令就立即执行。

批处理(Batch):由用户事先编好一个完整的Shell脚本,Shell会一次性的执行脚本中的诸多命令。

查看SHELL变量发现系统已默认使用Bash作为命令行的终端解释器了。

2.1 编写简单的脚本

创建example.sh并写入如下内容

Shell脚本的文件可以任意命名,但是为了避免被误认为普通文件,一般以 .sh 后缀命名。

上面的文件中出现了三总不同的元素:

第一行的脚本声明(#!)告诉系统使用哪种Shell解释器执行脚本;

第二行的注释信息(#)是对脚本功能和某些命令的介绍;

第三、四行是可执行语句,即Linux命令。

执行结果如下:

除了通过bash命令直接运行Shell脚本之外,还可以通过输入完整路径的方式来执行。这种方式默认会因为权限不足报错,此时只需为脚本文件增加执行权限即可。

2.2 接收用户的参数

上文脚本命令过于死板,为了能够接收用户的参数,可以使用Linux内设的用于接受参数的变量。

$0:当前Shell脚本程序的名称
$#:总共有几个参数
$*:所有位置的参数值
$?:显示上一次命令的执行返回值
$1、$2、$3...分别对应第1个、第2个、第3个位置的参数值,以此类推。

examle.sh:

执行

2.3 判断用户的参数

Shell脚本中的条件测试语法可以判断表达式是否成立,若成立返回数字0,否则返回其他随机数。条件测试语句格式:[ 条件表达式 ],条件表达式两边均应有一个空格。

按测试对象划分,条件测试语句可分为四种:文件测试语句、逻辑测试语句、整数值比较语句、字符串比较语句。

文件测试即使用指定条件来判断文件是否存在 或 权限是否满足等情况的运算符。文件测试的运算符及其作用:

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

判断 /etc/fstab 是否为一个目录类型的文件,返回值不是0,所以不是一个目录类型的文件。

返回值为0,所以 /etc/fstab 是个一般文件。

&& 在Shell中是逻辑“与”的运算符,表示前面的命令执行成功才会执行它后面的命令。

|| 表示逻辑“或”,前面命令执行失败才会执行后面的。

还有一种逻辑语句是“非”,符号为感叹号(!),表示把条件测试中的判断结果取相反值。

整数比较运算仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然的使用日常生活中的大于小于和等号。因为等号与赋值命令冲突,大于小于号与输出和输入重定向符号冲突。规范的整数比较运算符如下:

-eq:是否等于
-ne:是否不等于
-gt:是否大于
-lt:是否小于
-le:是否小于或等于
-ge:是否大于或等于

字符串比较语句用于判断测试字符串是否为空,或两个字符串是否相同。运算符如下:

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

String变量为空,即未定义该变量。

3.流程控制语句

3.1 if条件测试语句

① if条件语句的单分支结构由if、then、fi 关键字组成,语法格式:

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

此例即为通过单分支的if语句完成的文件创建。

② if的双分支结构由if、then、else、fi 关键字组成,语法格式:

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

ping命令测试与对方主机网络联通性,-c 规定尝试次数, -i 定义每个数据包的发送间隔, -W 定义等待超时时间。

③ if多分支结构由if、then、else、elif、fi 关键字组成,语法格式:

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

read命令用于读取用户输入信息,能把接收到的用户输入信息赋值给后面的指定变量, -p 表示向用户显示一定的提示信息。

3.2 for条件循环

for循环允许脚本一次读取多个信息,然后逐一对信息进行操作处理,语法格式:

for 变量名 in 取值列表
do 命令序列
done

3.3 while条件循环语句

语法格式:

while 条件测试操作
do 命令序列
done

以下便是一个通过while循环来猜测数值大小的脚本 Guess.sh

$RANDOM变量表示调取一个随机数(范围0~32767),这里把它对1000进行取余操作。此脚本可以让用户与程序互动,最终得出正确的随机数,执行结果如下:

3.4 case条件测试语句

语法结构:

case 变量值 in
模式 1)
命令序列 1
;;
模式 1)
命令序列 2
;;
......
*)
默认命令序列
esac

在while循环的例子中有个缺陷,就是输入只能为数字,如果输入非数字脚本就会崩溃。这个时候就可以通过case结合通配符来解决这个问题。

4.计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务,可以按照如下方式理解:

一次性计划任务:今晚11点30分开启网站服务。

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

顾名思义,一次性计划任务只执行一次,一般用于满足临时的工作需求。我们可以用at命令实现这种功能,只需要写成“at 时间”的形式就可以。如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令;要想将其删除,可以用“atrm 任务序号”。在使用at命令来设置一次性计划任务时,默认采用的是交互式方法。例如,使用下述命令将系统设置为在今晚23:30分自动重启网站服务。

如果希望Linux系统能够周期性地、有规律地执行某些具体的任务,那么Linux系统中默认启用的crond服务简直再适合不过了。创建、编辑计划任务的命令为“crontab -e”,查看当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为“crontab -r”。另外,如果您是以管理员的身份登录的系统,还可以在crontab命令中加上-u参数来编辑他人的计划任务。

使用crond服务设置任务的参数格式:“分、时、日、月、星期 命令”。

假设在每周一、三、五的凌晨3点25分,都需要使用tar命令把某个网站的数据目录进行打包处理,使其作为一个备份文件。我们可以使用crontab -e命令来创建计划任务。为自己创建计划任务无需使用-u参数,具体的实现效果的参数如crontab -l命令结果所示:

需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。以及用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2分钟执行一次任务)。

如果在crond服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。例如我们再添加一条计划任务,它的功能是每周一至周五的凌晨1点钟自动清空/tmp目录内的所有文件。尤其需要注意的是,在crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用whereis命令进行查询,rm命令路径为下面输出信息中加粗部分。

计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。

原文地址:https://www.cnblogs.com/achangblog/p/8420970.html