Vim编辑器与Shell命令脚本

Vim文本编辑器

Vim编辑器中设置了3中模式——命令模式、末行模式、和编辑模式,每种模式分别又支持多种不同的命令快捷键,大大提高了工作效率

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

模式间的切换详见下图

每次运行Vim编辑器时,默认进入命令模式,此时需要先切换到输入模式后在进行文档编辑工作,而在每次编写玩文档后需要先返回命令模式,再进入末行模式,执行保存或退出操作

命令模式最常用的一些命令

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

末行模式常用的一些命令

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

配置主机名称

在Linux系统中,主机名大多保存在/etc/hostname文件中,比如,将/etc/hostname文件中内容修改为mylinux

  1. 使用Vim编辑器修改/etc/hostname主机名称文件
    1
    vim /etc/hostname
  2. 把原始主机名称删除后追加mylinux

    需要在末行模式下执行:wq!命令

  3. 保存并退出文档,使用hostname命令检查是否修改成功

    hostname命令用于查看当前主机名称,但有时主机名称不会立即同步更新到系统中,可重启查看

配置网卡信息

网卡 IP 地址配置的是否正确是两台服务器是否可以相互通信的前提。

在 Linux 系统中,一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件。

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

现在有一个名称为ifcfg-eno16777736的网卡设备,我们将其配置为开机自启动,并且 IP 地址、子网、网关等信息由人工指定,其步骤应该如下所示。

  1. 首先切换到/etc/sysconfig/network-scripts目录中(存放着网卡的配置文件)。
  2. 使用 Vim 编辑器修改网卡文件ifcfg-eno16777736,逐项写入下面的配置参数并保存退出。由于每台设备的硬件及架构是不一样的,因此使用ifconfig命令确认各自网卡的默认名称。

    设备类型 TYPPE=Ethernet
    地址分配模式 BOOTPROTO=static (static表示静态IP,dhcp表示动态获取IP)
    网卡名称 NAME=ens160
    是否启动 ONBOOT=yes (yes表示启动,no表示不启动)
    IP地址 IPADDR=192.168.10.10
    子网掩码 NETMASK=255.255.255.0
    网关地址 GATEWAY=192.168.10.1
    DNS地址 DNS1=192.168.10.1

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

    nmcli connection reload ens160重启网络服务,ping命令测试网络是否连通(ping命令不会自动终止,可使用CTRL+C强制结束进程)

配置软件仓库

软件仓库是一种能够进一步简化RPM管理软件的难度以及自动化分析所需软件包及其依赖关系的技术,既让想要使用软件仓库,就要先把它搭建起来,然后将其配置规则确定好
搭建并配置软件仓库的步骤如下

  1. 进入/etc/yum.repos.d/目录中
  2. 使用Vim编辑器创建一个新的配置文件(文件名称可以随意,但后缀必须为.repo),逐项写入以下配置参数并保存退出

    仓库名称:具有唯一标识,不应与其他软件仓库发生冲突
    描述信息:可以是一些介绍性的词,易于识别软件仓库的作用
    仓库位置:软件包的获取方式,可以使用FTPHTTP下载,也可以是本地的文件(需要在后面添加file参数)
    是否启用:设置此源是否可用,1为可用,0为禁用
    是否校验:设置此源是否校验,1为校验,0为不校验
    公钥位置:若上面的参数开启了校验功能,则此处为公钥文件位置,若没有开启,则省略不用写

  3. 按照配置参数中所填写的仓库位置挂载光盘,并把光盘挂载信息写入/etc/fstab文件中
  4. 使用dnf install httpd-y命令检查软件仓库是否开启已经可用

编写Shell脚本

可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性
Shell脚本命令的工作方式有下面两种

  1. 交互式
    用户每输入一条命令就立即执行
  2. 批处理
    由用户实现编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多命令

通过查看SHELL变量可以发现,当前系统已经默认使用Bash作为命令终端解释器了
echo $SHELL

编写简单的脚本

如果想查看当前工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本应该类似于下面这样

1
2
3
4
5
vim example.sh
#!/bin/bash
#For Example
pwd
ls -al

shell脚本文件的名称可以随意,但为了避免被误以为是普通文件,建议加上.sh后缀

上面的脚本文件实际上出现了三种不同的元素

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

第二行的注释信息#是对该脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息

第三、四行的可执行语句也就是我们平时执行的Linux命令

运行该脚本
bash example

接受用户的参数

为了让Shell脚本程序更好地满足用户的一些实时需求,以便灵活完成工作,必须要让脚本程序能够像之前执行命令时那样,接受用户输入的参数
其实,Linux系统中的Shell脚本语言已经考虑到这些,也内设了用于接收参数的变量,变量之间使用空格间隔,参数变量详见下表

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

判断用户的参数

Shell脚本中条件车是语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回非零值,条件测试语法的执行格式为[ 条件表达式 ]
注意条件表达式两边应均有一个空格
按照测试对象来划分,条件测试语句可以分为4中

  1. 文件测试语句
  2. 逻辑测试语句
  3. 整数值比较语句
  4. 字符串比较语句
    文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体参数如下表所示
运算符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

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

整数比较运算符

整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,可用整数比较运算符如下表所示

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

字符串比较运算符

字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同,字符串比较中常见的运算符如下表所示

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

流程控制语句

if条件测试语句

if条件测试语句可以让脚本根据实际情况自动执行相应的命令,if条件测试语句分为单分支结构,双分支结构,多分支结构,其复杂度随着灵活度一起逐级上升

单分支结构

语法格式

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

双分支结构

语法格式

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

多分支结构

语法格式

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

for条件循环语句

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

1
2
3
4
for 变量名 in 取值列表
do
命令序列
done

while条件循环语句

while条件循环语句是一种脚本根据某些条件来重复执行命令的语句,不同于for循环语句,while语句通过判断条件测试的真假决定是否继续执行命令,若命令为真就继续执行,若条件为假就结束循环
语法格式

1
2
3
4
while 条件测试操作
do
命令序列
done

case条件测试语句

case语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试,如果数据不在所以列出的范围内,则会去执行星号*中所定义的默认命令
语法格式

1
2
3
4
5
6
7
8
9
10
11
case 变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
*)
默认命令序列
esac

计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务

  1. 一次性计划任务
    只执行一次,一般用于临时性的工作请求
  2. 长期性计划任务
    能够周期性地、有规律的执行某些某些具体的任务

一次性计划任务

使用at 时间的格式,如果想要查看已设置好但还未执行的一次性计划任务,可以使用at -l命令,先要将其删除,可以使用atrm 任务序号,查询当前设置的at任务列表,可以使用atq命令
at命令中常见参数如下表所示

参数 作用
-f 指定包含命令的任务文件
-q 指定新任务名称
-l 显示待执行任务的列表
-d 删除指定的待执行任务
-m 任务执行后向用户发邮件

例:
5分钟后执行/bin/date

1
2
3
at now +5 minutes
/bin/date
<EOT>(CTRL+D提交任务)

长期性计划任务

使用Linux系统中默认的crond服务

创建、编辑计划任务的命令为crontab -e
查看当前计划任务的命令为crontab -l
删除某条计划任务的命令为crontab -r
编辑他人计划任务的命令为crontab -u(管理员权限)

命令时间格式

1
2
3
4
5
6
7
8
*     *    *   *   *  command
分  时  日  月  周  命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

*表示为任意时间
,表示间隔的多个不连续时间点
-表示一个连续的时间范围
/数字表示间隔的时间频率

例:
每月1、10、22日的4 : 45重启apache
45 4 1,10,22 /usr/local/etc/rc.d/lighttpd restart