Vim编辑器与Shell命令脚本(第90页)
Vim中常用的命令【编辑模式】
命令 | 解释 |
---|---|
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标处开始的 5 行 |
yy | 复制光标所在整行 |
5yy | 复制从光标处开始的 5 行 n 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
u | 撤销上一步的操作 |
p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 |
ngg | n是数字,跳转到第n行 |
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编辑器修改配置主机名称
[root@localhost workdir]# hostname #查看当前主机名称
localhost.lws
[root@localhost workdir]# vim /etc/hostname #打开vim编辑器,并如下修改主机名称
localhost.lws2
[root@localhost workdir]# hostname #再次查看当前主机名称
localhost.lws2
编写简单的脚本(第101页)
[root@localhost lws]# vim example.sh
#!/bin/bash
pwd
ls -al
[root@localhost lws]# bash example.sh #执行 example.sh脚本
/root/lws
总用量 8
drwxrwxrwx. 2 root root 23 6月 18 15:04 .
dr-xr-x---. 16 root root 4096 6月 18 15:04 ..
-rw-r--r--. 1 root root 22 6月 18 14:58 example.sh
除了上面用 bash 解释器命令直接运行 Shell 脚本文件外,第二种运行脚本程序的方法是
通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚
本文件增加执行权限即可
[root@localhost lws]# ./example.sh
-bash: ./example.sh: 权限不够
[root@localhost lws]# chmod u+x example.sh
[root@localhost lws]# ./example.sh #也可以用 sh example.sh
/root/lws
总用量 8
drwxrwxrwx. 2 root root 23 6月 18 15:10 .
dr-xr-x---. 16 root root 4096 6月 18 15:10 ..
-rwxr--r--. 1 root root 23 6月 18 15:10 example.sh
接收用户的参数(第102页)
脚本文件后面输入字符每个空隔就是一个变量,在脚本内用$N(N为数字)调用外面变量作为参数
[root@localhost lws]# vim example.sh #建立一个脚本文件,内容如下:
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。 "
echo "第1 个参数为$1,第5个参数为$5。"
[root@localhost lws]# sh example.sh a b c d e f g #执行此脚本
当前脚本名称为example.sh
总共有7个参数,分别是a b c d e f g。
第1 个参数为a,第5个参数为e。
判断用户的参数(第102页)
文件测试所用的参数
命令 | 解释 |
---|---|
-d | 测试文件是否为目录类型;0为存在,1为不存在 |
-e | 测试文件是否存在;0为存在,1为不存在 |
-f | 判断是否为一般文件;0为文件,1为目录或其它 |
-r | 测试当前用户是否有权限读取;0可读取,1为不可读取 |
-w | 测试当前用户是否有权限写入;0为可写入,1为不可写入 |
-x | 测试当前用户是否有权限执行;0为执行,1为不可执 |
用法:格式 [ 空隔 参数 文件或目录 空隔 ]
[root@localhost ~]# [ -d /etc/fstab ]
[root@localhost ~]# echo $?
1
逻辑运算符(102页)
运算符 | 解释 |
---|---|
&& | 当前面的命令执行成功后才会执行它后面的命令 |
|| | 前面的命令执行失败后才会执行它后面的命令 |
! | 把条件测试中的判断结果取相反值 |
可用的整数比较运算符(第104页)
运算符 | 解释 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-ge | 是否大于或等于 |
-lt | 是否小于 |
-le | 是否小于或等于 |
用法:
[root@localhost ~]# [ 10 -gt 9 ]
[root@localhost ~]# echo $? # 输出结果为0即是真(TRUE)
0
[root@localhost ~]# [ 10 -gt 11 ]
[root@localhost ~]# echo $? #输出结果为1即是假(FALST)
1
实例:模拟判断内存不足(第105页)
[root@localhost ~]# free -m #查看内存详细
total used free shared buffers cached
Mem: 1826 1244 582 9 1 413
-/+ buffers/cache: 830 996
Swap: 2047 0 2047
[root@localhost ~]# free -m | grep Mem: # 过滤只显示 Mem 行
Mem: 1826 1244 582 9
[root@localhost ~]# free -m | grep Mem: | awk '{print $4}' #保留第4列
582
# 组合命令,赋给变量,注意最外面是反引号(ESC键下面 【`~】)
[root@localhost ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@localhost ~]# echo $FreeMem
582
# 582小于1024 执行成功 && 运行后面的输出
[root@localhost lws]# [ $FreeMem -lt 1024 ] && echo "内存不足"
内存不足
流程控制语句(第106页)
if 条件语句(第106页)
if单分支语句
[root@localhost lws]# vim aa.sh #用VIM编辑器创建一个脚本文件
#!/bin/bash
DIR="/home/lws/cd" #将路径赋给变量DIR
if [ ! -e $DIR ] #!表示没有,-e文件判断,路径变量;如果两边相等即是“没有”和“没有”相等
#那么没有文件成立(即结果是0)就执行if下面语句
then
mkdir -p $DIR #递归创建变量的路径
fi
if双分支语句
[root@localhost lws]# vim chkhost.sh #创建sh文件
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null
# 【ping】参数:-c 3 尝试次数为3;-i 0.2 数据包间隔0.2秒;-w 3 超时等待3秒
# $1:脚本文件后面第一个参数(这里输入IP地址)
# &> /dev/null 将数据丢到黑洞
if [ $? -eq 0 ]
#如果 $?上一次命令;没有发生错误(也就是 ping 通)即值是0,所以分支输出下面提示语句
then
echo "服务器在线"
else
echo "服务器不在线"
if
[root@localhost lws]# sh chkhost.sh 192.168.1.146 #这里的服务器主机
服务器在线
[root@localhost lws]# sh chkhost.sh 192.168.1.147 #没有此主机
服务器不在线
if多分支语句
[root@localhost lws]# vim chkscore.sh
#!/bin/bash
read -p "请输入 0~100 的数:" GRADE
#read:是用来读取用户输入信息的命令
# -p :于向用户显示一定的提示信息
#GRADE:等待用户输入的变量
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then # 用 ; 号可以将两条命令写在同一行
echo "优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "及格"
else
echo "$GRADE 输入错误"
#下面为执行脚本效果
[root@localhost lws]# sh chkscore.sh
请输入 0~100 的数:90
优秀
[root@localhost lws]# sh chkscore.sh
请输入 0~100 的数:75
及格
[root@localhost lws]# sh chkscore.sh
请输入 0~100 的数:10
10 输入错误
for 条件循环语句(第109页)
用 for 循环语句添加用户并设置密码
[root@localhost lws]# vim Example.sh
#!/bin/bash
read -p "请输入用户密码:" PASSWD #read -p 读入
for UNAME in `cat users.txt`
#for循环历遍文本文件;
#注:读取文本内容用反单引号,在反引号中的字符串将解释成shell命令来执行
do #执行循环
id $UNAME &>/dev/null #id查找用户名,并将信息丢到黑洞
if [ $? -eq 0 ] #如果查到id号存在即 $?不等于0,就输出"用户已经存在"
then
echo "用户已经存在"
else #如果用户不存就就执行下面代码
useradd $UNAME &> /dev/null #创建用户
echo "$passwd" | passwd --stdin $UNAME &> /dev/null #给用户设置密码
if [ $? -eq 0 ] #如果设置密码成功 $?值为0,输出创建成功
then
echo "$UNAME,创建成功"
else
echo "$UNAME,创建失败"
fi
fi
done #结束循环
#执行Example.sh脚本文件
[root@localhost lws]# sh Example.sh
请输入用户密码:aa888888
andy,创建成功
barry,创建成功
carl,创建成功
duke,创建成功
用户已经存在
用户已经存在
#查看用户配置文件的最后6行查看创建用户信息
[root@localhost lws]# tail -6 /etc/passwd
george:x:1006:1006::/home/george:/bin/bash
eric:x:1010:1010::/home/eric:/bin/bash
andy:x:1011:1011::/home/andy:/bin/bash
barry:x:1012:1012::/home/barry:/bin/bash
carl:x:1013:1013::/home/carl:/bin/bash
duke:x:1014:1014::/home/duke:/bin/bash
用 for 循环语句 检测IP是否在线
#新建一个文本文件加入IP地址
[root@localhost lws]# vim ipadd.txt
192.168.1.145
192.168.1.146
192.168.1.147
#新建 sh文件
[root@localhost lws]# vim ipon.sh
#!/bin/bash
for IP in $(cat /home/lws/ipadd.txt)
#之前用返引号引入cat命令,在处用 $引用命令
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] #如果没有发生错误 $?的值为0
then
echo "$IP 在线"
else
echo "$IP 不在线"
fi
done
[root@localhost lws]# chmod u+x ipon.sh
#设置 sh文件为可执行
[root@localhost lws]# sh ipon.sh
#执行sh文件
192.168.1.145 不在线
192.168.1.146 在线
192.168.1.147 不在线
while 条件循环语句(第111页)
[root@localhost lws]# vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
#注意:这里=号两边不能有空隔,测试时用了空隔总是找不到错误原因
#expr:echo $(expr 1 + 1 ),expr运算符后式子中间要有空隔 1空隔+空隔1
TIMES=0 #定义一个累加变量
echo "商品价格 0~999 之间,猜猜看是多少"
while true #while循环,这个循环只有执行了 exit 0 才会退出循环
do
read -p "输入价格:" INT
let TIMES++
#注:let算术表达式,表达式内变量不用加$(运算符中间不能有空隔)
#例 定义变量AA=1; let AA=1+1;echo $AA 。输出结果是2
if [ $INT -eq $PRICE ]; then
echo "答对了,价格是: $PRICE"
echo "总共答了 $TIMES 次"
exit 0 #猜对了就退出循环
elif [ $INT -gt $PRICE ]; then
echo "高了,再猜" #猜错了 while 循环从头开始
else
echo "低了,再猜" #猜错了 while 循环从头开始
fi
done
#执行 sh文件
[root@localhost lws]# sh Guess.sh
商品价格 0~999 之间,猜猜看是多少
输入价格:500
低了,再猜
输入价格:900
低了,再猜
输入价格:1000
高了,再猜
输入价格:950
高了,再猜
输入价格:930
低了,再猜
输入价格:940
低了,再猜
输入价格:945
低了,再猜
输入价格:946
低了,再猜
输入价格:947
低了,再猜
输入价格:948
答对了,价格是: 948
总共答了 10 次
case 条件测试语句(第112页)
[root@localhost lws]# vim casesh.sh
#!/bin/bash
read -p "请输入字符:" KEY
case "$KEY" in [a-z]|[A-Z])
# "$KEY"将变量格式转为字符
# case 格式: case 要检测的变量 in 检测命令,也可以是( $KEY in 值)
echo "您输入的是字母"
;; [0-9]) # 【;;】必须的格式,即 【 ;; 值)】
echo "您输入的是数字"
;; *) #多少 case分就都可以
echo "您输入的是符号"
esac #返转命令结束 case语句
#执行结果
[root@localhost lws]# sh casesh.sh
请输入字符:5
您输入的是数字
[root@localhost lws]# sh casesh.sh
请输入字符:d
您输入的是字母
[root@localhost lws]# sh casesh.sh
请输入字符:=
您输入的是符号
计划任务服务程序(第113页)
- at 一次性计划任务
第一种方式
#在指定时间创建目录,计划任务是在后台运行
[root@localhost lws]# at 13:26 #at执行计划任务 后面只须时间
at> mkdir atdir
at> <EOT> #这里是按键盘组合键(CTRL键+D键)来保存退出
job 9 at Sun Jun 21 13:26:00 2020
[root@localhost lws]#
查看计划任务列表 at -l
[root@localhost lws]# at -l
10 Sun Jun 21 13:32:00 2020 a root
12 Sun Jun 21 13:33:00 2020 a root
删除计划任务
[root@localhost lws]# at -l
10 Sun Jun 21 13:32:00 2020 a root
12 Sun Jun 21 13:33:00 2020 a root
#这里查到计划任务有两个
[root@localhost lws]# atrm 10 #删除第10序号的任务
[root@localhost lws]# at -l #再次查看,第10序号的任务已经删除
12 Sun Jun 21 13:33:00 2020 a root
- crontab 周期性计划任务
格式: 分钟 小时 日 月 星期 命令
【,】表示多个时间段,每个字段都可使用
【-】表示连续,如 (在日字段):1-5 表示1至5号
【/】表示间隔时间,如(在分钟字段):*/2 表示每隔2分钟参数:
-e 编辑计划任务;-l 查看当前计划任务;
-r 删除某条计划任务;
-u 管理普通用户计划任务 crontab -u 用户名注意:分钟,小时一定要输入,日月与星期不能同时防止冲突,不输入要用*代替
[root@localhost lws]# crontab -e #执行任务后进入 VIM编辑如下
10 14 21 6 * mkdir /home/lws/cr_dir
#创建一个计划任务,也可以在此配置文件中修改删除
[root@localhost lws]# crontab -l
10 14 21 6 * mkdir /home/lws/cr_dir
#查看计划任务
[root@localhost lws]# crontab -r # 直接删除所有计划任务