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
?字符串 在文本中从下至上所搜改字符串
/字符串 在文本中从上至下所搜改字符串
给文档取名字:linux.txt,如果存在则打开,否则创建
输入之后按Esc退出
输入:wq!强制保存并退出,使用cat查看内容
在文件中追加语句,并强制退出不保存,使用cat查看
在Linux系统中,主机名大多保存在/etc/hostname文件中
[root@chenstudy ~]# vim /etc/hostname
chen
# 重启虚拟机之后在进行查看
[root@chen ~]# hostname
chen
[root@chen ~]#
在 Linux 系统中, 一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件
在CentOS7中网卡配置文件的前缀为ifcfg开始
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cc396254-ae13-43c7-aaec-23b8866d98a1
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.130
GATEWAY=192.168.200.2
DNS1=192.168.200.2
# 设备类型:TYPE=Ethernet
# 地址分配模式:BOOTPROTO=static
# 网卡名称:NAME=en33
# 是否启动:ONBOOT=yes
# IP 地址:IPADDR=192.168.200.130
# 网关地址:GATEWAY=192.168.200.2
# DNS 地址:DNS1=192.168.200.2
[root@chen network-scripts]# systemctl restart network
[root@chen network-scripts]# ping 192.168.200.130
PING 192.168.200.130 (192.168.200.130) 56(84) bytes of data.
64 bytes from 192.168.200.130: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.200.130: icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from 192.168.200.130: icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from 192.168.200.130: icmp_seq=4 ttl=64 time=0.074 ms
64 bytes from 192.168.200.130: icmp_seq=5 ttl=64 time=0.073 ms
^C
--- 192.168.200.130 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.042/0.063/0.074/0.015 ms
[root@chen network-scripts]#
4.1.4、配置Yum软件仓库
Yum 软件仓库的作用是为了进一步简化 RPM 管理软件的难度以及自动分析 所需软件包及其依赖关系的技术 ,要使用 Yum 软件仓库,就要先把它搭建起来,然后将其配置规则确定好才行
[root@chen network-scripts]# cd /etc/yum.repos.d/
[root@chen yum.repos.d]# vim centos7.repo
[root@chen yum.repos.d]# vim centos7.repo
[centos7]
name=centos7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
[root@chen yum.repos.d]# mkdir -p /media/cdrom
[root@chen yum.repos.d]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
[root@chen yum.repos.d]# vim /etc/fstab
[root@chen yum.repos.d]# vim /etc/fstab
[root@chen yum.repos.d]# yum install httpd
已安装:
httpd.x86_64 0:2.4.6-97.el7.centos.5
作为依赖被安装:
httpd-tools.x86_64 0:2.4.6-97.el7.centos.5 mailcap.noarch 0:2.1.41-2.el7 完毕!
可以将 Shell 终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与 Linux 系 统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程 语言才有的控制结构特性。要想正确使用 Shell 中的这些功能特性,准确下达命令尤为重要。 Shell 脚本命令的工作方式有两种:交互式和批处理。
交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本 中诸多的命令。
在 Shell 脚本中不仅会用到前面学习过的很多 Linux 命令以及正则表达式、管道符、数据 流重定向等语法规则,还需要把内部功能模块化后通过逻辑语句进行处理,最终形成日常所 见的 Shell 脚本 。
使用Vim 编辑器把 Linux 命令按照顺序依次写入到一个 文件中,这就是一个简单的脚本了
# 如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本应该类似于下面这样
[root@chen ~]# vim chen.sh
#!/bin/bash
# For Ex BY chen
pwd
ls -al
[root@chen ~]# bash chen.sh
/root
总用量 120
dr-xr-x---. 17 root root 4096 4月 18 18:31 .
dr-xr-xr-x. 18 root root 4096 3月 25 03:11 ..
-rw-------. 1 root root 1476 4月 15 23:54 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
drwx------. 13 root root 4096 3月 25 03:27 .cache
# 第二种运行脚本程序的方法是通过输入完整路径的方式来执行
# 但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可
[root@chen ~]# ./chen.sh
-bash: ./chen.sh: 权限不够
[root@chen ~]# chmod u+x chen.sh
[root@chen ~]# ./chen.sh
/root
总用量 120
dr-xr-x---. 17 root root 4096 4月 18 18:31 .
dr-xr-xr-x. 18 root root 4096 3月 25 03:11 ..
-rw-------. 1 root root 1476 4月 15 23:54 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
drwx------. 13 root root 4096 3月 25 03:27 .cache
#Linux 系统中的 Shell 脚本语言 已经内设了用于接收参数的变量,变量之间可以使用空格间隔。
# 例如$0 对应的是当前 Shell 脚本程序的名称,
# $#对应的是总共 有几个参数,
# $*对应的是所有位置的参数值,
# #?对应的是显示上一次命令的执行返回值,而 $1、$2、$3……则分别对应着第 N 个位置的参数值
[root@chen ~]# vim chen.sh
#!/bin/bash
# For Ex BY chen
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第 1 个参数为$1,第 5 个为$5。"
[root@chen ~]# sh chen.sh one two three four five six
当前脚本名称为chen.sh
总共有6个参数,分别是one two three four five six。
第 1 个参数为one,第 5 个为five。
[root@chen ~]#
系统在执行 mkdir 命令时会判断用户输入的信息,即判断用户 指定的文件夹名称是否已经存在,如果存在则提示报错;反之则自动创建。Shell 脚本中的条 件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值 。
# 测试语句表达式: [ 条件表达式 ]([]两边均应有一个空格)
条件测试语句可以分为 4 种:
文件测试所用的参数
运算符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
#使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在
[root@chen ~]# [ -d /etc/fstab ]
[root@chen ~]# echo $?
1
# 使用文件测试语句来判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存在,且为一般文件
[root@chen ~]# [ -f /etc/fstab ]
[root@chen ~]# echo $?
0
[root@chen ~]#
# 此可以用来判断/dev/cdrom 文件是否存在,若存在则输出 Exist 字样;逻辑“与”的运算符号是&&
[root@chen ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
[root@chen ~]# echo $USER
root
# 逻辑“或”,运算符号为||
[root@chen ~]# [ $USER = root ] || echo "user"
[root@chen ~]# su - chen
上一次登录:四 4月 14 23:07:57 CST 2022pts/2 上
[chen@chen ~]$ [ $USER = root ] || echo "user"
user
[chen@chen ~]$ exit
登出
# 逻辑“非”的运算符号叹号(!)
[root@chen ~]# [ ! $USER = root ] || echo "Administrator"
Administrator
[root@chen ~]#
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
[root@chen ~]# [ 10 -gt 10 ]
[root@chen ~]# echo $?
1
[root@chen ~]# [ 10 -eq 10 ]
[root@chen ~]# echo $?
0
[root@chen ~]#
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
# 通过判断 String 变量是否为空值,进而判断是否定义了这个变量
[root@chen ~]# [ -z $String ]
[root@chen ~]# echo $?
0
[root@chen ~]# [ -z $String "chen" ]
[root@chen ~]# echo $?
1
[root@chen ~]# echo $LANG
zh_CN.UTF-8
[root@chen ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
[root@chen ~]#
使用Linux命令、管道符、重定向以及条件测试语句来编写最基本的shell脚本,但是不适合生产环境,接下来我们将学习if、for、while、case四种流程语句来学习编写更强大、功能更强的脚本。
# 下面使用单分支的 if 条件语句来判断/chen/study 目录是否存在,若存在就结束条件判断和整个 Shell 脚本,反之则去创建这个目录
[root@chen ~]# vim mkstudy.sh
#!/bin/bash
DIR="/chen/study"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
# 执行脚本
[root@chen ~]# bash mkstudy.sh
[root@chen ~]# ls -d /chen/study
/chen/study
# 使用双分支的 if 条件语句来验证某台主机是否在线,然后根据返回值的结果,要么 显示主机在线信息,要么显示主机不在线信息
[root@chen ~]# vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 id On-line."
else
echo "Host $1 is Off-line."
fi
# 执行脚本
[root@chen ~]# vim chkhost.sh
[root@chen ~]# bash chkhost.sh 192.168.200.130
Host 192.168.200.130 id On-line.
[root@chen ~]# bash chkhost.sh 192.168.200.131
Host 192.168.200.131 is Off-line.
[root@chen ~]#
[root@chen ~]# vim chkcore.sh
#!/bin/bash
read -p "Enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is PASS"
elif [ $GRADE -ge 0 ] && [ $GRADE -le 69 ] ; then
echo "$GRADE is Fail"
else
echo "Plase enter legal score"
fi
# 执行脚本
[root@chen ~]# vim chkcore.sh
[root@chen ~]# bash chkcore.sh
Enter your score (0-100):88
88 is Excellent
[root@chen ~]# bash chkcore.sh 200
Enter your score (0-100):200
Plase enter legal score
for 循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据 有范围时,使用 for 循环语句再适合不过了
# 使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码
# 1.首先创建用户名称的列表文件 users.txt,每个用户名称单独一行
[root@chen ~]# vim user.txt
chen
zj
ldz
wxy
# 2.接下来编写 Shell 脚本 chen.sh
# /dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁
[root@chen ~]# vim chen.sh
#!/bin/bash
# For Ex BY chen
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat user.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
echo "$UNAME , Create success"
fi
done
# 执行批量创建用户的 Shell 脚本 chen.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。
[root@chen ~]# vim user.txt
[root@chen ~]# vim chen.sh
[root@chen ~]# vim chen.sh
[root@chen ~]# bash chen.sh
Enter The Users Password : linux
chen , Already exists
zj , Create success
ldz , Create success
wxy , Create success
# 如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息
[root@chen ~]# tail -6 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
chen:x:1000:1000:chen:/home/chen:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zj:x:1001:1001::/home/zj:/bin/bash
ldz:x:1002:1002::/home/ldz:/bin/bash
wxy:x:1003:1003::/home/wxy:/bin/bash
[root@chen ~]#
# 让脚本从文本中自动读取主机列表,然后自动逐个测试这些主机是否在线
[root@chen ~]# vim ipadds.txt
192.168.200.130
192.168.200.131
192.168.200.132
# 双分支 if 条件语句与 for 循环语句相结合,让脚本从主机列表文件 ipadds.txt中自动读取 IP 地址(用来表示主机)并将其赋值给 HLIST 变量,从而通过判断 ping 命令执行后的返回值来逐个测试主机是否在线
[root@chen ~]# vim CheckHosts.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
[root@chen ~]# ./CheckHosts.sh
-bash: ./CheckHosts.sh: 权限不够
[root@chen ~]# chmod u+x CheckHosts.sh
[root@chen ~]# ./CheckHosts.sh
Host 192.168.200.130 is On-line.
Host 192.168.200.131 is Off-line.
Host 192.168.200.132 is Off-line.
[root@chen ~]#
while 条件循环语句是一种让脚本根据某些条件来重复执行while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行, 为假就结束循环 命令的语句
# 接下来结合使用多分支的 if 条件测试语句与 while 条件循环语句,编写一个用来猜测数值大小的脚本 Guess.sh
[root@chen ~]# vim Guess.sh
[root@chen ~]# vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 100)
TIMES=0
echo "商品的价格在0-99之间,猜猜看是多少?"
while true
do
read -p "请输入你猜的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答对了,商品的实际价格 $PRICE."
echo "你共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
# 执行脚本
[root@chen ~]# bash Guess.sh
商品的价格在0-99之间,猜猜看是多少?
请输入你猜的价格数目:90
太高了!
请输入你猜的价格数目:85
太高了!
请输入你猜的价格数目:60
太高了!
请输入你猜的价格数目:25
太低了!
请输入你猜的价格数目:45
太高了!
请输入你猜的价格数目:42
太高了!
请输入你猜的价格数目:39
太高了!
请输入你猜的价格数目:30
太低了!
请输入你猜的价格数目:36
太低了!
请输入你猜的价格数目:38
恭喜你答对了,商品的实际价格 38.
你共猜测了 10 次
[root@chen ~]#
case 语句是在多个范围内匹配 数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内, 则会去执行星号(*)中所定义的默认命令
# 我们编写脚本 Checkkeys.sh,提示用户输入一个字符并将其赋值给变量 KEY, 然后根据变量 KEY 的值向用户显示其值是字母、数字还是其他字符
[root@chen ~]# vim CheckKeys.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是空格 、功能键或其他控制字符。"
esac
# 保存并执行程序
[root@chen ~]# vim CheckKeys.sh
[root@chen ~]# bash CheckKeys.sh
请输入一个字符,并按Enter键确认:Z
您输入的是 字母。
[root@chen ~]# bash CheckKeys.sh
请输入一个字符,并按Enter键确认:3
您输入的是 数字。
[root@chen ~]# bash CheckKeys.sh
请输入一个字符,并按Enter键确认:
您输入的是空格 、功能键或其他控制字符。
[root@chen ~]#
# “at 时间”:一次性计划任务
# “at -l”命令:查看已设置好但还未执行的一次性计划任务
# “atrm 任务序号”:删除任务
[root@chen ~]# at 23:20
at> systemctl restart network
at> 此处请同时按下 Ctrl + D 组合键来结束编写计划任务
job 2 at Wed Apr 20 23:20:00 2022
[root@chen ~]# at -l
2 Wed Apr 20 23:20:00 2022 a root
[root@chen ~]# atrm 2
[root@chen ~]# at -l
# at 命令接收前面 echo 命令的输出信息,以达到通过非交互式的方式创建计划一次性任务的目的
[root@chen ~]# echo "systemctl restart network" | at 23:30
job 3 at Wed Apr 20 23:30:00 2022
[root@chen ~]# at -l
3 Wed Apr 20 23:30:00 2022 a root
[root@chen ~]#
在正式部署计划任务前,请先跟刘遄老师念一下口诀“分、时、日、月、星期 命令”需要注意的是,如果有些字段 没有设置,则需要使用星号(*)占位
字段 | 说明 |
---|---|
分 | 取值为0~59的整数 |
时 | 取值为0~23的任意整数 |
日 | 取值为1~31的任意整数 |
月 | 取值为1~12的任意整数 |
星期 | 取值为0-7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
# 假设在每周一、三、五的凌晨 3 点 25 分,都需要使用 tar 命令把某个网站的数据目录进行打包处理,使其作为一个备份文件
# crontab -e 命令来创建计划任务
[root@chen ~]# crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
[root@chen ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@chen ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
[root@chen ~]#
注意:需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、9 月 和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”, 则表示每月的 12~15 日)。以及用除号(/)表示执行任务的间隔时间(例如“/2”表示每隔 2 分钟执行一次任务)之外
在 crond 服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。
[root@chen ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[root@chen ~]#
# 我们再 添加一条计划任务,它的功能是每周一至周五的凌晨 1 点钟自动清空/tmp 目录内的所有文件
[root@chen ~]# crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
[root@chen ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
[root@chen ~]#