Vim编辑器与Shell命令脚本
命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
输入模式:正常的文本录入。
末行模式:保存或退出文档,以及设置编辑环境
命令 | 作用 |
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 |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
可以分别使用a、i、o三个键从命令模式切换到输入模式。其中,a键与i键分别是在光标后面一位和光标当前位置切换到输入模式,而o键则是在光标的下面再创建一个空行
- 4.1.2 配置主机名称
- 将/etc/hostname配置文件的内容修改为“linuxprobe.com”
-
第1步:使用Vim编辑器修改/etc/hostname主机名称文件。
第2步:把原始主机名称删除后追加“linuxprobe.com”。注意,使用Vim编辑器修改主机名称文件后,要在末行模式下执行“:wq!”命令才能保存并退出文档。
第3步:保存并退出文档,然后使用hostname命令检查是否修改成功。
- 4.1.3 配置网卡信息
- 现在有一个名称为ifcfg-ens160的网卡设备,将其配置为开机自启动,并且IP地址、子网、网关等信息由人工指定,其步骤如下所示。
-
第1步:首先切换到/etc/sysconfig/network-scripts目录中(存放着网卡的配置文件)。
第2步:使用Vim编辑器修改网卡文件ifcfg-ens160,逐项写入下面的配置参数并保存退出。由于每台设备的硬件及架构是不一样的,因此请读者使用ifconfig命令自行确认各自网卡的默认名称。
设备类型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
网卡名称:NAME=ens160
是否启动:ONBOOT=yes
IP地址:IPADDR=192.168.10.10
子网掩码:NETMASK=255.255.255.0
网关地址:GATEWAY=192.168.10.1
DNS地址:DNS1=192.168.10.1
第3步:重启网络服务并测试网络是否连通。
4.1.4 配置软件仓库 - 软件仓库是一种能进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术,可以把Yum或DNF想象成是一个硕大的软件仓库,里面保存有几乎所有常用的工具,而且只需要说出所需的软件包名称,系统就会自动为您搞定一切
- Yum与DNF软件仓库的配置文件是通用的,也就是说填写好配置文件信息后,这两个软件仓库的命令都是可以正常使用。建议在RHEL 8中使用dnf作为软件的安装命令,因为它具备更高的效率,而且支持多线程同时安装软件。
-
搭建并配置软件仓库的大致步骤如下所示。
第1步:进入/etc/yum.repos.d/目录中(因为该目录存放着软件仓库的配置文件)。
第2步:使用Vim编辑器创建一个名为rhel8.repo的新配置文件(文件名称可随意,但后缀必须为.repo),逐项写入下面的配置参数并保存退出。
仓库名称:具有唯一性的标识名称,不应与其他软件仓库发生冲突。
描述信息(name):可以是一些介绍性的词,易于识别软件仓库的用处。
仓库位置(baseurl):软件包的获取方式,可以使用FTP或HTTP下载,也可以是本地的文件(需要在后面添加file参数)。
是否启用(enabled):设置此源是否可用;1为可用,0为禁用。
是否校验(gpgcheck):设置此源是否校验文件;1为校验,0为不校验。
公钥位置(gpgkey):若上面的参数开启了校验功能,则此处为公钥文件位置。若没有开启,则省略不写。
第3步:按配置参数中所填写的仓库位置挂载光盘,并把光盘挂载信息写入/etc/fstab文件中。
第4步:使用“dnf install httpd -y”命令检查软件仓库是否已经可用
- 4.2 编写Shell脚本
-
Shell脚本命令的工作方式有下面两种。
交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
-
- 4.2.1 编写简单的脚本
-
[root@linuxprobe ~]# vim example.sh #!/bin/bash #For Example BY linuxprobe.com pwd ls -al
Shell脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh后缀加上,以表示是一个脚本文件。
在上面的这个example.sh脚本中实际上出现了3种不同的元素:第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本;第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;第三、四行的可执行语句也就是我们平时执行的Linux命令了
-
除了上面用Bash解释器命令直接运行Shell脚本文件外,第二种运行脚本程序的方法是通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可(详见第5章)。初次学习Linux系统的读者不用心急,等下一章学完用户身份和权限后再来做这个实验也不迟:
[root@linuxprobe ~]# ./example.sh bash: ./Example.sh: Permission denied [root@linuxprobe ~]# chmod u+x example.sh [root@linuxprobe ~]# ./example.sh /root total 60 dr-xr-x---. 15 root root 4096 Oct 12 00:41 . dr-xr-xr-x. 17 root root 224 Jul 21 05:04 .. -rw-------. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg -rw-------. 1 root root 335 Jul 24 06:33 .bash_history -rw-r--r--. 1 root root 18 Aug 13 2018 .bash_logout -rw-r--r--. 1 root root 176 Aug 13 2018 .bash_profile ………………省略部分输出信息………………
-
- 4.2.2 接收用户的参数
-
命令不仅要能接收用户输入的内容,还要有能力进行判断区别,根据不同的输入调用不同的功能。
其实,Linux系统中的Shell脚本语言早就考虑到了这些,已经内设了用于接收参数的变量,变量之间使用空格间隔。例如,$0对应的是当前Shell脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第N个位置的参数值
-
[root@linuxprobe ~]# vim example.sh #!/bin/bash echo 当前脚本名称为$0 echo 总共有$#个参数,分别是$*。 echo 第1个参数为$1,第5个为$5。 [root@linuxprobe ~]# bash example.sh one two three four five six 当前脚本名称为example.sh 总共有6个参数,分别是one two three four five six。 第1个参数为one,第5个为five
-
- 4.2.3 判断用户的参数
-
本书在前面章节中讲到,系统在执行mkdir命令时会判断用户输入的信息,即判断用户指定的文件夹名称是否已经存在,如果存在则提示报错;反之则自动创建。Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回非零值。条件测试语法的执行格式如图4-16所示。切记,条件表达式两边均应有一个空格。
- &&是逻辑“与”,只有当前面的语句执行成功的时候才会执行后面的语句。
-
[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo Exist Exist
||是逻辑“或”,只有当前面的语句执行失败的时候才会执行后面的语句。 -
[root@linuxprobe ~]# echo $USER root [root@linuxprobe ~]# [ $USER = root ] || echo user [root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo user user
!是逻辑“非”,代表对逻辑测试结果取反值;之前若为正确则变成错误,若为错误则变成正确- 当前我们正在登录的即为管理员用户—root。下面这个示例的执行顺序是,先判断当前登录用户的USER变量名称是否等于root,然后用逻辑“非”运算符进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户。最后若条件成立,则会根据逻辑“与”运算符输出user字样;若条件不满足,则会通过逻辑“或”运算符输出root字样,而只有在前面的&&不成立时才会执行后面的||符号
-
[root@linuxprobe ~]# [ ! $USER = root ] && echo user || echo root root
- 4.3 流程控制语句
- 4.4 计划任务服务程序