博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vim编辑器与Shell命令脚本
阅读量:4946 次
发布时间:2019-06-11

本文共 5667 字,大约阅读时间需要 18 分钟。

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 编写简单文档

1322881-20180206121434841-1795238918.png

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

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

1322881-20180206122106685-361147045.png

然后便可以输入文本。

1322881-20180206122240295-1464862467.png

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

1322881-20180206122415451-523786137.png

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

1322881-20180206122453420-843365746.png

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

1.2 配置主机名称

为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有IP地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问。在Linux

系统中,主机名大多保存在/etc/hostname文件中,接下来将/etc/hostname文件的内容修改为“linuxprobe.com”,步骤如下。

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

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

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

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

1322881-20180206123339138-192530051.png

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

1322881-20180206125640966-718176452.png

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

1322881-20180206125719060-43955073.png

执行重启网卡设备的命令(在正常情况下不会有提示信息),然后通过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=..)、HTTP(..)、本地(..)。

 enabled=1:设置此源是否可用;1为可用,0为禁用。

 gpgcheck=1:设置此源是否校验文件;1为校验,0为不校验。

 gpgkey=。

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

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

2.编写Shell脚本

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

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

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

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

1322881-20180206134942201-833887907.png

2.1 编写简单的脚本

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

1322881-20180206135712201-1789119072.png

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

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

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

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

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

执行结果如下:

1322881-20180206140235935-978176010.png

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

1322881-20180206140450279-1441775940.png

2.2 接收用户的参数

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

$0:当前Shell脚本程序的名称

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

examle.sh:

1322881-20180206141423185-1588944869.png

执行

1322881-20180206141704951-1681001925.png

2.3 判断用户的参数

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

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

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

-d:测试文件是否为目录类型

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

1322881-20180206182113310-1435172174.png

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

1322881-20180206182250607-738784272.png

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

1322881-20180206182814091-853608276.png

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

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

1322881-20180206183424935-1252955155.png

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

1322881-20180206184339185-1170644385.png

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

-eq:是否等于

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

1322881-20180206185007263-1426357812.png

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

=:比较字符串是否相同

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

1322881-20180206190242966-871993593.png

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

3.流程控制语句

3.1 if条件测试语句

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

if 条件测试操作

then 命令序列
fi

1322881-20180206191145513-1174178661.png

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

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

if 条件测试操作

then 命令序列1
else 命令序列2
fi

1322881-20180206193212326-1193515186.png

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

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

if 条件测试操作

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

1322881-20180206194855545-26470435.png

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

3.2 for条件循环

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

for 变量名 in 取值列表

do 命令序列
done

3.3 while条件循环语句

语法格式:

while 条件测试操作

do 命令序列
done

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

1322881-20180206221811826-1691955492.png

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

1322881-20180206221927435-973020994.png

3.4 case条件测试语句

语法结构:

case 变量值 in

模式 1)
命令序列 1
;;
模式 1)
命令序列 2
;;
......
*)
默认命令序列
esac

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

1322881-20180206223502826-952690276.png

4.计划任务服务程序

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

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

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

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

1322881-20180206230045951-1756316950.png

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

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

1322881-20180206230329341-1662514844.png

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

1322881-20180206230703060-661837544.png

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

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

1322881-20180206230839920-1858304717.png

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

转载于:https://www.cnblogs.com/achangblog/p/8420970.html

你可能感兴趣的文章
JNI NewString
查看>>
QTP日期控件
查看>>
Linux:Ubuntu 14.04 Server 离线安装Jjava8(及在线安装)
查看>>
KMP算法介绍总结
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>
代理模式
查看>>
MySQL数据类型
查看>>
处理date类型对象的方式
查看>>
创建数据库的注意事项
查看>>
开源DataGridView扩展(2) 自定义的Button列
查看>>
Codeforces Round #100 E. New Year Garland (第二类斯特林数+dp)
查看>>
laravel PC内部方法调用
查看>>
Activity 工作流配置
查看>>
java学习笔记-JavaWeb篇三
查看>>
类型重命名 typedef
查看>>
leecode第七十二题(编辑距离)
查看>>
git 常用命令
查看>>
java休眠
查看>>
Android之SQLite
查看>>
kafka基本原理
查看>>