Vim 编辑器与 Shell 命令脚本

发布于2020-08-21   566 次阅读


本文最后更新于2022年6月1日,已超过 1 年没更新!内容可能已失效,请自行测试。

Vim文本编辑器

在 Linux 系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数

  • 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作
  • 输入模式:正常的文本录入
  • 末行模式:保存或退出文档以及设置编辑环境

命令作用
dd删除(剪切)光标所在整行
5dd删除(剪切)从光标处开始的5行
yy复制光标所在整行
5yy复制从光标处开始的5行
n显示搜索命令定位到的下一个字符串
N显示搜索命令定位到的上一个字符串
u撤销上一步的操作
p将之前删除(dd)或复制(yy)过的数据粘贴到光标后面
Vim中常用的命令
命令作用
: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
?字符串在文本中从下至上搜索该字符串
/字符串在文本中从上至下搜索该字符串
末行模式中可用的命令

编写简单文档

创建一个临时的输入文件
vim test.txt
打开文档后,默认进入的是Vim编辑器的命令模式
可以分别使用 a、i、o三个键从命令模式切换到输入模式。
其中a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,o 键则是在光标的下面再创建一个空行
敲击键盘 Esc 键从输入模式返回命令模式
输入:wq!切换到末行模式保存退出

配置主机名称

主机名大多保存在/etc/hostname中

  • 使用 Vim编辑器修改“/etc/hostname”主机名称文件
  • 把原始主机名称删除后追加“YEYUFAN”
  • 保存并退出文档然后使用 hostname 命令检查是否修改成功

hostname 命令用于查看当前的主机名称, 但有时主机名称的改变不会立即同步到系统中,需要重启查看

配置网卡信息

在 Linux系统中,一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件

在 RHEL 5,RHEL 6 中,网卡配置文件的前缀为 eth,第 1 块网卡为eth0,第2 块网卡为 eth1,以此类推.而在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg开始,加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736.

  • 首先切换到/etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)
  • 使用 Vim编辑器修改网卡文件 ifcfg-eth0
    • 设备类型:TYPE=Ethernet
    • 地址分配模式:BOOTPROTO=s
    • 网卡名称:NAME=eno16777736
    • 是否启动:ONBOOT=yes
    • IP 地址:IPADDR=192.168.10.10
    • 子网掩码:NETMASK=255.255.
    • 网关地址:GATEWAY=192.168.1
    • DNS 地址:DNS1=192.168.10.1
  • 重启网络服务并测试网络是否联通systemctl restart network

配置Yum软件仓库

进入到/etc/yum.repos.d/目录中(存放着Yum软件仓库的配置文件)
cd /etc/yum.repos.d
用wget下载repo文件 
wget  http://mirrors.aliyun.com/repo/Centos-7.repo
备份系统原来的repo文件
mv  CentOs-Base.repo CentOs-Base.repo.bak
替换系统的repo文件
mv Centos-7.repo CentOs-Base.repo
执行yum源更新命令
yum clean all
yum makecache
yum update

编写Shell脚本

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

  • 交互式:用户每输入一条命令就立即执行。
  • 批处理:由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本中诸多的命令

编写简单的脚本

查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本
vim example.sh
#!/bin/b
#For Exa
pwd  
ls -al 
:wq保存退出
运行脚本
bash example.sh

接收用户的参数

vim example.sh
#!/bin/bash 
echo "当前脚本名称为$0" 
echo "总共有$#个参数,分别是$*。" 
echo "第1个参数为$1,第5个为$5。"

sh example.sh one two three four five six 

判断用户的参数

条件测试语句可以分为 4 种

  • 文件测试语句
  • 逻辑测试语句
  • 整数值比较语句
  • 字符串比较语句
运算符作用
-d测试文件是否为目录类型
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行
文件测试所用的参数

使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件, 然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值.如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在.

[ -d /etc/fstab ] 
echo $?

逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果.例如在 Shell终端中逻辑 “与” 的运算符号是&&, 它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断/etc/passwd文件是否存在,若存在则输出 Exist字样

[ -e /etc/passwd ] && echo "Exist"

逻辑“或” ,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令

echo $USER
[ $USER != root ] || echo "user"

逻辑语句“非”,在 Linux 系统中的运算符号是一个叹号! ,它表示把条件测试中的判断结果取相反值

运算符作用
-eq是否等于
-ne是否不等于
-gt是否大于
-lt是否小于
-le是否等于或小于
-ge是否大于或等于
可用的整数比较运算符
FreeMem=`free -m | grep Mem: | awk '{print $4}'
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory" 
运算符作用
=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为
常见的字符串比较运算符
[ -z $String]
 echo $? 
echo $LANG
 [ $LANG != "en.US" ] && echo "Not en.US" 

流程控制语句

if 条件测试语句

if 条件语句的单分支结构由 if、then、fi关键词组成,而且只在条件成立后才执行预设的命令, 相当于口语的 “如果……那么……” .

判断/media/cdrom 目录是否存在,若存在就结束条件判
断和整个 Shell脚本,反之则去创建这个目录
vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

if 条件语句的双分支结构由 if、then、else、fi 关键词组成,它进行一次条件匹配判断,如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令,相当于口语的“如果……那么……或者……那么……”.

验证某台主机是否在线,然后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息
vim chkhost.sh
#!/bin/bash 
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null 
if [ $? -eq 0 ] 
then 
echo "Host $1 is On-line." 
else 
echo "Host $1 is Off-line." 
fi

if 条件语句的多分支结构由 if、then、else、elif、fi关键词组成,它进行多次条件匹配判断,多次判断中的任何一项在匹配成功后都会执行相应的预设命令,相当于口语的“如果……那么……如果……那么……”.

判断用户输入的分数在哪个成绩区间内
vim chkscore.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 -gt 100 ] || [ $GRADE -lt 0 ] ; then
echo "Error!"
else
echo "$GRADE is Fail"  
fi

For 条件循环语句

vim users.txt
andy 
barry 
carl 
duke 
eric 
george


vim Example.sh 
#!/bin/bash 
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

while条件循环语句

vim Guess.sh
#!/bin/bash 
PRICE=$(expr $RANDOM % 1000) 
TIMES=0 
echo "商品实际价格为0-999之间,猜猜看是多少?" 
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 

case条件测试语句

vim Checkkeys.sh
#!/bin/bash 
read -p "请输入一个字符,并按Enter键确认:" KEY 
case "$KEY" in 
[a-z]|[A-Z]) 
echo "您输入的是 字母。" 
;; 
[0-9]) 
echo "您输入的是 数字。" 
;; 
*) 
echo "您输入的是 空格、功能键或其他控制字符。" 
esac

计划任务服务程序

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

  • 一次性计划任务:今晚 11 点 30 分开启网站服务
  • 长期性计划任务:每周一的凌晨 3 点 25 分把/home/wwwroot 目录打包备份为backup.tar.gz

顾名思义,一次性计划任务只执行一次,一般用于满足临时的工作需求。我们可以用 at命令实现这种功能,只需要写成“at 时间”的形式就可以

如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令.要想将其删除,可以用“atrm 任务序号” .在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法.

at 23:30
at > systemctl restart httpd
at > 同时按下Ctrl + D 组合键来结束编写计划任务 
at -l

创建、编辑计划任务的命令为“crontab -e”

口诀“分、时、日、月、星期 命令”

在每周一、三、五的凌晨 3 点 25 分,都需要使用 tar 命令把某个网站的数据目录进
行打包处理

25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
  • Vim编辑器的三种模式分别是什么?
    • 命令模式、末行模式与输入模式
  • 怎么从输入模式切换到末行模式?
    • 需要先敲击 Esc 键退回到命令模式,然后敲击冒号(:)键后进入末行模式
  • 一个完整的 Shell脚本应该哪些内容?
    • 应该包括脚本声明、注释信息和可执行语句
  • 分别解释 Shell脚本中$0 与$3 变量的作用
    • 在 Shell 脚本中,$0 代表脚本文件的名称,$3 则代表该脚本在执行时接收的第三个参数
  • if 条件测试语句有几种结构,最灵活且最复杂的是哪种结构?
    • if条件测试语句包括单分支、双分支与多分支等三种结构,其中多分支结构是最灵活且最复杂的结构,其结构形式为 if…then…elif…then…else…fi
  • for 条件循环语句的循环结构是什么样子的?
    • for条件循环语句的结构为“for 变量名 in 取值列表 do 命令序列 done
  • 若在 while条件循环语句中使用 true 作为循环条件,那么会发生什么事情?
    • 因条件测试值永久为 true, 因此脚本中循环部分会无限地重复执行下去, 直到碰到 exit命令才会结束
  • 如果需要依据用户的输入参数执行不同的操作,最方便的条件测试语句是什么?
    • case条件语句
  • Linux 系统的长期计划任务所使用的服务是什么,其参数格式是什么?
    • 长期计划任务需要使用 crond 服务程序,参数格式是“分、时、日、月、星期 命令”

=

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。