vim编辑器与Shell命令脚本
本章讲解如何使用Vim编辑器来编写、修改文档,然后通过逐个配置主机名称、系统网卡以及Yum软件仓库参数文件实验。
结合前面章节的Linux命令、命令语法与Shell脚本中各种流程控制,实现最终自动化工作的脚本文件。
4.1 Vim文本编辑器
与vi相比增加了着色功能,可以避免错误参数的产生。
4.1.1编写简单文档
默认:命令模式
ESC在命令模式与其它模式间切换
a、i、o进入 输入模式=插入模式=编辑模式
: 进入末行模式
a和i只是光标位置不同,都直接开始编辑。—insert—
o是从下一行开始编辑
wq:保存退出
wq!:强制保存退出
命令模式下:
命令 | 作用 |
---|---|
yy | 复制光标所在行 |
5yy | 复制从光标处开始的5行 |
p | 粘贴到光标所在行 |
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标处开始的5行 |
u | 撤销上一步的操作 |
:wq! | w写入,q退出,!强制 |
4.1.2 配置主机名
vim /etc/hostname
linuxprobe.com
4.1.3 配置网卡信息
[root@linuxprobe ~]# cd /etc/sysconfig/network-scripts/
[root@linuxprobe network-scripts]# ls
ifcfg-eno16777728 ifdown-ppp ifup-eth ifup-sit
ifcfg-lo ifdown-routes ifup-ippp ifup-Team
ifdown ifdown-sit ifup-ipv6 ifup-TeamPort
ifdown-bnep ifdown-Team ifup-isdn ifup-tunnel
ifdown-eth ifdown-TeamPort ifup-plip ifup-wireless
ifdown-ippp ifdown-tunnel ifup-plusb init.ipv6-global
ifdown-ipv6 ifup ifup-post network-functions
ifdown-isdn ifup-aliases ifup-ppp network-functions-ipv6
ifdown-post ifup-bnep ifup-routes
[root@linuxprobe network-scripts]# vim ifcfg-eno16777728
WADDR=00:0C:29:39:74:BE
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777728
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1
~
[root@linuxprobe network-scripts]# systemctl restart network
[root@linuxprobe network-scripts]# ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.069 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.050 ms
64 bytes from 192.168.10.10: icmp_seq=5 ttl=64 time=0.086 ms
^C
--- 192.168.10.10 ping statistics ---
4.14 配置Yum软件仓库
后续再详细学习
[xiaonao] #唯一标识符
mame=xiaonao #仓库名称
baseurl=file:///media/cdrom #挂载目录
enabled=1 #设置此源可用
gpgcheck=0 #0为不校验,1为校验
[root@linuxprobe network-scripts]# vim /etc/yum.repos.d/xiaonao.repo
[xiaonao] #唯一标识符
mame=xiaonao #仓库名称
baseurl=file:///media/cdrom #挂载目录
enabled=1 #设置此源可用
gpgcheck=0 #0为不校验,1为校验
[root@linuxprobe network-scripts]# mkdir -p /media/cdrom
[root@linuxprobe network-scripts]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@linuxprobe network-scripts]# vim /etc/fstab
[root@linuxprobe network-scripts]# yum install httpd
yum install httpd
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Repository 'xiaonao' is missing name in configuration, using id
xiaonao | 4.1 kB 00:00:00
(1/2): xiaonao/group_gz | 134 kB 00:00:00
(2/2): xiaonao/primary_db | 3.4 MB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-17.el7 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-17.el7 for package: httpd-2.4.6-17.el7.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-17.el7.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-17.el7.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-17.el7.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package httpd-tools.x86_64 0:2.4.6-17.el7 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==================================================================================================================================================================================================================
Package Arch Version Repository Size
==================================================================================================================================================================================================================
Installing:
httpd x86_64 2.4.6-17.el7 xiaonao 1.2 M
Installing for dependencies:
apr x86_64 1.4.8-3.el7 xiaonao 103 k
apr-util x86_64 1.5.2-6.el7 xiaonao 92 k
httpd-tools x86_64 2.4.6-17.el7 xiaonao 77 k
mailcap noarch 2.1.41-2.el7 xiaonao 31 k
Transaction Summary
==================================================================================================================================================================================================================
Install 1 Package (+4 Dependent packages)
Total download size: 1.5 M
Installed size: 4.3 M
Is this ok [y/d/N]: y
Downloading packages:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 5.9 MB/s | 1.5 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : apr-1.4.8-3.el7.x86_64 1/5
Installing : apr-util-1.5.2-6.el7.x86_64 2/5
Installing : httpd-tools-2.4.6-17.el7.x86_64 3/5
Installing : mailcap-2.1.41-2.el7.noarch 4/5
Installing : httpd-2.4.6-17.el7.x86_64 5/5
xiaonao/productid | 1.6 kB 00:00:00
Verifying : mailcap-2.1.41-2.el7.noarch 1/5
Verifying : httpd-tools-2.4.6-17.el7.x86_64 2/5
Verifying : apr-1.4.8-3.el7.x86_64 3/5
Verifying : apr-util-1.5.2-6.el7.x86_64 4/5
Verifying : httpd-2.4.6-17.el7.x86_64 5/5
Installed:
httpd.x86_64 0:2.4.6-17.el7
Dependency Installed:
apr.x86_64 0:1.4.8-3.el7 apr-util.x86_64 0:1.5.2-6.el7 httpd-tools.x86_64 0:2.4.6-17.el7 mailcap.noarch 0:2.1.41-2.el7
Complete!
[root@linuxprobe network-scripts]#
4.2 编写Shell脚本
工作方式:
交互式:输入一条命令就立即执行
批处理:事先编好一个完整的Shell脚本,Shell一次性执行多条命令
4.2.1 编写简单的脚本
#!/bin/bash #脚本声明,指明解释器的名字
#For Example #注释
命令1
命令2
脚本文件通常以.sh为后缀
脚本执行方式:
1、bash 文件名.sh
2、路径+文件名.sh(这里要求x权限)
4.2.2 接收用户的参数
Shell内部参数
参数 | 表述 |
---|---|
$0 | 脚本名称参数 |
$n | 接收到的第n个参数的值 |
$# | 接收到的参数数量 |
$? | 显示上一次命令的执行返回值 |
$* | 所有位置的参数值 |
[root@linuxprobe network-scripts]# vim example.sh
in/bash
#shiyanwenjian,yonglai liaojie jiaoben neizhi bianliang
echo "dangqianjiaobenmingcheng $0"
echo "zonggongyou $# gecanshu"
echo "first $1,fifth $5"
[root@linuxprobe network-scripts]# sh example.sh 1 2 3 4 5 6
dangqianjiaobenmingcheng example.sh
zonggongyou 6 gecanshu
first 1,fifth 5
[root@linuxprobe network-scripts]#
4.2.3 判断用户的参数
Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。
测试语句格式:[ 条件表达式 ]
按照测试对象来划分为四种:
文件测试语句;
逻辑测试语句;
整数值比较语句;
字符串比较语句;
文件测试语句:使用指定条件来判断文件是否存在或权限是否满足等情况的运算符。
运算符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 测试是否为一般文件 |
-r、-w、-x | 测试文件权限 |
逻辑测试语句:对测试结果进行逻辑分析,根据测试结果可实现不同的效果。
运算符 | 作用 |
---|---|
&& | 逻辑与,前面成功,后面继续执行 |
ll | 逻辑或,前面失败,后面继续执行 |
! | 逻辑非,先取反,再执行。[ ! 测试条件 ] |
整数值比较语句 仅仅对数字进行比较,不能使用数学符号。
运算符 | 作用 |
---|---|
-eq | =号 |
-gt | >号 |
-lt | <号 |
-le | <=号 |
-ge | >=号 |
-ne | 不等于 |
字符串比较语句:判断测试字符串是否为空值,或两个字符串是否相同。
运算符 | 作用 |
---|---|
-z | 判断字符串内容是否为空,用来查看某个变量是否存在 |
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不相同 |
例子:判断内存使用情况,设定两个变量
HAHA:取出内存查看命令中,Mem行的第四列(当前内存空闲量)
NC:判断内存空闲量是否小于1024MB,若为真则提示“ERROR”,若为假则提示“Enought”
[root@linuxprobe ~]# HAHA=free -m | grep Mem: | awk '{print $4}'
[root@linuxprobe ~]# NC=`[ $HAHA -lt 1024 ] && echo "ERROR" || echo "Enought"`
[root@linuxprobe ~]# echo $NC
Enought
[root@linuxprobe ~]#
4.3 流程控制语句
Linux命令、管道符、重定向、条件测试语句虽能编辑简单的Shell脚本执行一些任务,但还有两个很大的不足,不能根据具体的工作来调整执行命令,不能按条件实现自动循环执行。
所以我们必须学习if、for、while、case这四种流程控制语言
4.3.1 if条件测试语句
让脚本根据实际情况自动执行相应的命令。
分为三种:单分支、双分支、多分支
if 单分支语句:if、then、fi
格式:
if 条件测试操作(真)
then 命令序列
fi
若…(成立)…则…(执行…)
例子:
#!/bin/bash
#if text
if [ ! -e /media/haha ] #判断haha这个目录是否不存在
then
mkdir -p /media/haha #若不存在,则新建haha目录
fi #兜底结束符
if 双分支语句:if、then、else、fi
格式:
if 条件测试
then 命令序列1--------为0
else 命令序列2--------非0
fi
若…则…否…则…
#!/bin/bash
#double if test
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null #ping一个输入的IP地址
if [ $? -eq 0 ];then #判断变量返回值是否为0
echo "$1 is On-line" #若为0,则显示在线
else
echo "$1 is Off-line" #若非0,则显示不在线
fi
[root@linuxprobe ~]# bash xiaoguo.sh 192.168.10.10
192.168.10.10 is On-line
[root@linuxprobe ~]# bash xiaoguo.sh 192.168.1.1
192.168.1.1 is Off-line
if 多分支语句:if、then、else、elif、fi
实际工作中最常用的一种复杂而灵活的判断结构。
这是电脑工作原理的精华,无非就是0/1,对与错。
格式:
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
4.3.2 for 条件循环语句
当要处理的数据有范围时使用。
一次性读取,多个信息,逐一对信息进行处理。
格式:
for 变量名 in 取值列表
do
命令序列
done
练习:
先创建一个用户名文本文件
vim user.txt
zhang3
li4
wang5
zhao6
qian7
sun8
zhou9
wu10
创建shell脚本
#!/bin/bash
#test
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
一次性创建多个用户
[root@linuxprobe ~]# bash usr.sh
Enter The Users Password : ×××
zhang3 , Create success
li4 , Create success
wang5 , Create success
zhao6 , Create success
qian7 , Create success
sun8 , Create success
zhou9 , Create success
wu10 , Create success
4.3.3 while 条件循环语句
按指定的条件 重复执行
4.3.4 case 条件测试语句
在多个范围内匹配数据,
4.4 计划任务服务程序
设置服务器的计划任务服务,把周期性、规律性的工作交给系统自动完成。
一次性任务:
at 时间,
以交互式方式设置任务,并用ctrl+D来终止对话。
重启后失效
长期性计划任务:
crond 服务名称
crontab 配置工具
crontab -e 创建编辑任务
crontab -l 查看任务
crontab -r 删除任务
注意:绝对路径+命令,必有命令的路径。可以使用whereis查找命令所在目录。
格式:
分 时 日 月 星 路径+命令
样式 | 说明 |
---|---|
30 * * * * | 每30分钟执行一次 |
30 2 * * * | 每天2:30分执行一次 |
30 2 8 5 * | 每年的5月8号2:30执行一次 |
30 2 * 5 3 | 5月份的每个周三执行一次 |
30 2-4 * * * | 每天2:30、3:30、4:30各执行一次 |
30 */2 * * * | 每隔2小时的半点执行一次 |
15,30,50 2 * * * | 每天2:15 2:30 2:50各执行一次 |
15,30 2 * * 6 | 每周六的2:15 2:30各执行一次 |
注意
1、命令必须加上绝对路径
2、“分”字段必须有值,不能为空或为*号
3、“日”和“星期”不能同时使用,否则会发生冲突