目录
第四章 Vim编辑器与Shell命令脚本
4.1 Vim文本编辑器
Vim 相较于 Vi,有了着色,减少了错误参数的产生;Vim 文件名 :若文件不存在会自动生成文件;
Vim编辑器有以下三种模式:
命令模式:控制光标移动,可以对文本进行复制、粘贴、删除、替换和查找等工作;也是其他两种模式切换的桥梁;
输入模式:正常的文本录入;
末行模式:保存或退出文档,已经设置编辑环境;
命令模式下常用命令:
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标所在行开始的5行 |
yy | 复制光标所在整行 |
5yy | 复制从光标所在行开始的5行 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
P | 将之前删除(dd)或复制(yy)过的数据粘贴到光标上一行 |
n | 显示搜索命令定位到的下一个字符串(搜索可以在末行模式":/xx"开始搜索,也可以直接在命令模式"/xx"开始搜索) |
N | 显示搜索命令定位到的上一个字符串 |
末行模式下常用命令:
命令 | 作用 |
---|---|
: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 |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
4.1.1 配置主机名称
Linux中主机名称大多保存在/etc/hostname
文件中
[root@localhost ~]$ vim /etc/hostname # 编辑当前文件修改主机名称
linuxfirstblood
[root@localhost ~]$ hostname # RHEL8中主机名称不会立即生效,需要重启
localhost.localdomain
4.1.2 配置网卡信息
网卡的配置文件在/etc/sysconfig/network-scripts/
目录中
[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens160
# 具体配置方法待补充
# todo:
4.1.3 配置Yum软件仓库
Yum软件仓库的配置文件在/etc/yum.repos.d/
目录中
第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着软件仓库的配置文件)。
第2步:使用Vim编辑器创建一个名为rhel8.repo的新配置文件(文件名称可随意,但后缀必须为.repo),逐项写入下面的配置参数并保存退出。(1-4需要配置,为RHCSA考察点)①仓库名称:具有唯一性的标识名称,不应与其他软件仓库发生冲突。
②描述信息(name):可以是一些介绍词,易于识别软件仓库的用处。
③仓库位置(baseurl):即软件包的获取方式,可以使用FTP、HTTP与本地file。
④是否启用(enabled):设置此源是否被使用,1为使用,0为禁用。
⑤是否检查(gpgcheck):设置此源是否被校验,1为校验,0为禁用。
⑥公钥位置(gpgkey):若上面参数开启了校验功能,则此处为公钥文件位置。若没有开启,此省略不写。第3步:按配置参数中所填写的仓库位置挂载光盘,并把光盘挂载信息写入到/etc/fstab文件中。
第4步:使用“dnf install httpd -y”命令检查软件仓库是否已经可用。
#具体配置方法待补充
# todo:
4.2 编写Shell脚本
Shell脚本命令的工作方式有两种:
交互式(Interactive):用户没输入一条命令就立即执行;
批处理(Batch):由用户事先编辑写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多命令;
[root@localhost ~]$ echo $SHELL # 查看默认执行脚本的终端解释器
/bin/bash
4.2.1 脚本结构
组成:声明 + 注释 + 命令
命名:Shell脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh后缀加上,以表示是一个脚本文件。
执行方式:
- 用bash解释器命令直接运行Shell脚本文件;
- 通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可
[root@localhost ~]$ vim test.sh
#!/bin/bash # 声明解释器
#Test Shell script # 注释
pwd # 命令
ls -al | wc -l
[root@localhost ~]$ bash test.sh # 运行脚本
/root
36
4.2.2 接收用户参数及执行结果
$0:输出脚本名称;
$1,$3,$5:分别表示第几个输入参数(若参数不足,则会把当前为置空:a,b,
);
$#:总共输入几个参数;
$*:所有位置的参数(合集)
[root@localhost ~]$ vim param.sh
#!/bin/bash
#Receive Parameters Script
echo "name: $0"
echo "count:$#, enumerate:$*"
echo "param1:$1, param3:$3"
echo "param_not_exist:$9"
[root@localhost ~]$ bash param.sh 1,2,3,4,5,6,7,8
name: param.sh
count:1, enumerate:1,2,3,4,5,6,7,8
param1:1,2,3,4,5,6,7,8, param3:
param_not_exist:
4.2.3 条件测试语句 [ xx ] 及运算符
条件测试语句分为四种:
- 文件测试语句;
- 逻辑测试语句;
- 整数值比较语句;
- 字符串比较语句;
测试结果返回值可以用$?
接收查看
执行结果 | 含义 |
---|---|
0 | true(这个一定要注意) |
非0值 | false |
①文件测试操作符
操作符 | 作用 |
---|---|
-d | 测试文件是否为目录类型(directory) |
-e | 测试文件是否存在(exist) |
-f | 判断是否为一般文件(file) |
-r | 测试当前用户是否有权限读取(read) |
-w | 测试当前用户是否有权限写入(write) |
-x | 测试当前用户是否有权限执行(execute) |
[root@localhost ~]$ [ -d /etc/fstab ]
[root@localhost ~]$ echo $?
1
[root@localhost ~]$ [ -e /etc/fstab ] && echo "Exist"
Exist
②逻辑操作符
&&,||,!
这里要注意的是操作符可以连续使用,并且执行逻辑与java有些差异,如下:
# 逻辑操作符可以连续使用,但是并非依次向右判断执行,只有在左边的逻辑与不成立的情况下,才会执行右侧的逻辑或;
[root@localhost ~]$ [ ! $USER=root ] && echo "user" || echo "root"
root
③整数比较运算符
运算符 | 作用 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-le | 小于等于 |
-ge | 大于等于 |
[root@localhost ~]$ free -m
total used free shared buff/cache available
Mem: 1966 1253 175 16 537 536
Swap: 2047 0 2047
#以MB为单位,获取第四行所示的内存剩余量
[root@localhost ~]$ echo `free -m | grep Mem: | awk '{print $4}'`
175
④字符串比较
运算符 | 作用 |
---|---|
= | 相同 |
!= | 不同 |
-z | 为空(可以用来判断变量是否已使用) |
[root@localhost ~]$ [ -z $String ] && echo null || echo "not null"
null
[root@localhost ~]$ echo $LANG
en_US.UTF-8
[root@localhost ~]$ [ $LANG!="en_US" ] && echo "not en_US"
not en_US
4.3 流程控制语句
主要要注意写法,与java的差异;
获取用户输入参数、计算、退出脚本的命令需要学习:
read -p "Enter:" KEY # read读取用户输入信息,-p 用来展示提示信息;最后输入值作为变量KEY
PRICE=$(expr $RANDOM%1000) # RANDOM生成的随机数都是万位数,expr:代表计算后面的值;
# $() 和 ` ` 都表示执行里面的命令并返回结果
exit 0 # 表示退出脚本
4.3.1 if条件测试语句
如果if xxxx ; then
写到一行,要加 “;” 隔开
4.3.2 for条件循环语句
4.3.3 while条件循环语句
4.3.4 case条件测试语句
4.4 计划任务服务(定时任务)
4.4.1 单次定时任务
[root@localhost ~]$ at 21:00 # 设置单次定时任务时间
warning: commands will be executed using /bin/sh
at> reboot # 开始输入要执行的命令
at> <EOT> # 结束时按 ctrl + D
job 2 at Sat Jan 16 21:00:00 2021
[root@localhost ~]$ at -l # 查看单次定时任务
2 Sat Jan 16 21:00:00 2021 a root
[root@localhost ~]$ atrm 2 # 删除定时任务
4.4.2 长期定时任务
使用到的是crond
服务,设定则通过crontab
配置工具;
crontab -e:编辑定时任务,会自动通过vim打开定时任务文件,即可进行编辑;
crontab -l:查看当前定时任务;
crontab -r:删除某条定时任务;
crontab -u:如果您是以管理员的身份登录的系统,可以在crontab命令中加上-u参数来编辑他人的计划任务;
编辑定时任务的格式是:(分 时 日 月 星期 + 命令),如果有些字段没有被设置,则需要使用星号(*)占位;代表着:每(某个时间)执行(某命令)
使用crond设置任务的参数字段说明:
字段 | 说明 |
---|---|
分 | 取值为0~59的整数 |
时 | 取值为0~23的任意整数 |
日 | 取值为1~31的任意整数(当月没有31日则不执行) |
月 | 取值为1~12的任意整数 |
星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
这里要特地强调:
①命令
:在crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用whereis命令进行查询;
②日和星期一般不同时设置,因为无法同时满足就不会执行;
# 这里的 /usr/bin/ls 就是绝对路径
[root@localhost ~]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
定时任务范例,及格式学习:
[root@localhost ~]$ crontab -e
30 2-4 * * * /usr/bin/ls # 每天的2、3、4点30分执行
30 */2 * * * /usr/bin/ls # 每间隔2小时执行一次,如 0:30,2:30...
15,30,50 2 * * * /usr/bin/ls # 每天的 2:15, 2:30, 2:50执行
③考点:一定要检查crond
服务有没有启动,若没有则启动:
[root@localhost ~]$ systemctl status crond # 检查服务启动状态
#若没有,则重启服务并添加到开机启动
[root@localhost ~]$ systemctl restart crond
[root@localhost ~]$ systemctl enable crond