1、VIM文本编辑器
- VIM编辑器的三大模式
- 命令模式: 控制光标移动,可对文本进行复制、粘贴和查找等工作
- 输入模式: 正常的文本录入。
- 末行模式: 保存或退出文档,以及设置编辑环境
- 三种模式的切换:
注意: 命令模式切换到输入模式的3种方法:1、a键
:在光标的后一位切换到输入模式。2、i键
:在光标的当前位置切换到输入模式。3、o键
:在光标的下面再创建一个空行,并切换到输入模式,一般常用于文件追加操作中。
- 命令模式常用命令
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在的整行 |
5dd | 删除(剪切)光标处开始的5行 |
yy | 复制光标所在整行 |
5yy | 复制从光标处开始的5行 |
p | 将之前剪切或者复制过的数据粘贴到光标后面 |
u | 撤销上一步操作 |
n | 显示搜索命令定位到的下一个字符串(结合末行模式的搜索字符串命令) |
N | 显示搜索命令定位到的上一个字符串(结合末行模式的搜索字符串命令) |
- 末行模式常用命令
命令 | 作用 |
---|---|
:wq! | 写入 -> 退出 -> 强制 ,使用时可排列组合 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
?字符串 | 在本文中从下至上搜索该字符串 |
/字符串 | 在本文中从上至下搜索该字符串 |
: s/one/two | 将当前光标所在行的第一个one替换成two |
: s/one/two/g | 将当前光标所在行的所有one替换成two |
: %s/one/two/g | 将全文中所有的one替换成two |
-
小知识
1. 主机名大多存放在
/etc/hostname
中,可通过vim
编辑器编辑文件中的内容来更改主机名。
2、编写Shell脚本
-
Shell脚本的工作方式
-
交互式(interactive):用户输入一条命令就立即执行。
-
批处理(Batch):用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中的诸多命令。
eg: 查看当前命令行终端解释器
echo $SHELL #打印结果:/bin/bash 表明系统已经默认使用Bash作为命令行终端解释器了
-
-
编写简单的脚本
eg: 使用命令
vim example.sh
生成一个Shell脚本文件,最好添加.sh
后缀,文件内容如下:#!/bin/bash #This is a simple example pwd ls -l
其中,脚本声明
#!
告诉系统使用的Shell解释器,注释信息#
对脚本的信息进行介绍,其他内容则是相应的Linux命令。 -
运行Shell脚本文件
eg:bash example.sh
使用Bash解释器直接运行Shell脚本文件。
eg:
./example.sh
直接输入完整的路径来执行脚本文件。
-
接收用户的参数
eg: 使用命令
vim example.sh
生成一个Shell脚本文件,文件内容如下:#!/bin/bash echo "当前的脚本名称为$0" echo "总共有$#个参数,分别是$*" echo "第一个参数为$1,第五个参数为$5"
执行命令
bash example.sh 1 2 3 4 5
后,最后的执行结果为:当前的脚本名称为example.sh 总共有5个参数,分别是1 2 3 4 5 第一个参数为1,第五个参数为5
其中
$0
对应当前Shell脚本程序的名称,$1、$2、$3...
分别对应着第N
个位置的参数值,$#
对应参数的个数,$*
对应的是所有位置的参数值,$?
对应的是显示上一次命令的执行返回值。 -
判断用户的参数
测试语句的格式为
[ 条件表达式 ]
,注意方括号和条件表达式之间有空格。Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0
,否则便返回非零值
。条件测试语句可以分为4种:
- 文件测试语句
- 逻辑测试语句
- 整数值比较语句
- 字符串比较语句
-
文件测试语句
eg: 测试文件是否为目录类型
[ -d /etc/fstab ] #第一次执行 echo $? #第二次执行
输出结果为
1
,表明文件/etc/fstab
不是目录,或这个目录不存在
eg: 测试文件是否为一般文件[ -f ./example.sh ] #第一次执行 echo $? #第二次执行
输出结果为
0
,表明文件存在,且为一般文件。
eg: 测试文件是否存在[ -f ./xxxxxx ] #第一次执行 echo $? #第二次执行
输出结果为
1
,表明文件不存在文件测试所用的参数如下:
运算符 作用 -d 测试文件是否为目录类型 -e 测试文件是否存在 -f 判断是否为一般文件 -r 测试当前用户是否有权限读取 -w 测试当前用户是否有权限写入 -x 测试当前用户是否有权限执行 -
逻辑测试语句
eg: 测试文件是否为目录类型
[ ! -d /etc/fstab ] || echo "dir" && echo "Not a dir"
输出结果为
Not a dir
,表明文件/etc/fstab
不是目录,或这个目录不存在。执行顺序:语句[ ! -d /etc/fstab ]
返回真
,则不执行||
后的操作,而转去执行&&
后操作,即输出Not a dir
。逻辑测试所用的参数如下:
运算符 作用 && 只有当前面的语句为真,才执行后面的语句 || 只有当前面的语句为假,才执行后面的语句 ! 逻辑测试结果取反 -
整数值比较语句
eg: 比较两个数的大小
[ 1 -lt 2 ] && echo "True" || echo "False"
输出结果为
True
,表明1
比2
小。逻辑测试所用的参数如下:
运算符 作用 -eq 是否等于 -ne 是否不等于 -gt 是否大于 -lt 是否小于 -le 是否等于或小于 -ge 是否大于或等于 -
字符串比较语句
eg: 比较两个字符串是否相同
[ $USER = lh ] && echo "user is lh" || echo "user is not lh"
输出结果为
user is lh
,证明此时用户名称为lh
字符串测试所用的参数如下:
运算符 作用 = 比较字符串内容是否相同 != 比较字符串内容是否不同 -z 判断字符串内容是否为空
3、流程控制语句
-
if测试语句
- 单分支结构
if 条件测试语句 then 命令序列 fi
- 双分支结构
if 条件测试语句 then 命令序列1 else 命令序列2 fi
- 多分支结构
if 条件测试语句1 then 命令序列1 elif 条件测试语句2 then 命令序列2 else 命令序列3 fi
eg: 测试某台主机是否在线
1.使用命令
vim checkhost.sh
新建一个shell脚本,在脚本中编辑:#!/bin/bash ping -c 3 -i 0.2 -W 3 $1 &> /dev/null # -c:尝试的次数 -i:每个数据的发送间隔 -W:等待时间 # 文件/dev/null被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据。 if [ $? -eq 0 ] then echo "Host $1 is On-line" else echo "Host $1 is Off-line" fi
2.测试该脚本
bash checkhost.sh 127.0.0.1 #测试本地环回地址,最终屏幕打印:Host 127.0.0.1 is On-line bash checkhost.sh 192.168.123.123 #随便测试一个地址,最终屏幕打印:Host 192.168.123.123 is Off-line
-
for语句
for语句语法格式
for 变量名 in 取值列表 do 命令序列 done
eg:使用for循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码。
1.使用命令vim users.txt
新建用户列表:andy barry carl duke eric george
2.编写shell脚本
addusers.sh
#!/bin/bash read -p "Enter The Users Password:" PASSWD #脚本中使用read命令读取用户输入的密码,并赋值给PASSWD for UNAME in `cat users.txt` #上面这句亦可以修改成: #List = $(cat users.txt) #for UNAME in $List do id $UNAME &> /dev/null #"id 用户名"命令用于查看用户的信息 if [ $? -eq 0 ] then echo "$UNAME,Already exists" else useradd $UNAME echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null #密码传递 echo "$UNMAE ,Create sucess" fi done
3.执行脚本并输入相应的密码,屏幕中显示创建成功的信息,利用
tail -6 /etc/passwd
命令可以查看新建的用户信息。 -
while条件循环语句
while语句语法格式
while 条件测试判断 do 命令序列 done
eg:猜数字小游戏
#!/bin/bash #猜测数字游戏 REALNUM=$(expr $RANDOM % 1000) # expr语句用于表示表达式,具体用法自行查询 TIMES=0 # 猜测的次数 while true do read -p "请输入你猜测的数字(0-999):" INT let TIMES++ if [ $INT -gt $REALNUM ] then echo "你输入的数字太大了" elif [ $INT -eq $REALNUM ] then echo "恭喜你,这个数字就是 $INT" echo "本局你已经猜测了 $TIMES 次了" exit #切记:退出while循环时一定要使用exit命令 else echo "你输入的数字太小了" fi done
-
case条件测试语句
case语句语法格式
case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ...... *) 默认命令序列 esac
eg: 判断输入的字符类型
#!/bin/bash read -p "请输入一个字符:" KEY case $KEY in [A-Z]|[a-z]) echo "你输入的是字母" ;; [0-9]) echo "你输入的是数字" ;; *) echo "你输入的是特殊字符" esac
4、计划任务服务程序
-
计划的分类
- 一次性计划任务
- 长期性计划任务
-
一次性计划任务
eg: 使用交互式方法设置今晚23:30自动重启网站服务
[lh@LH_LINUX]$ at 23:30 warning: commands will be executed using /bin/sh at> systemctl restart httpd at> #使<CTRL>+<D>结束编写计划任务 job 1 at Sat Mar 18 23:30:00 2023
eg: 使用非交互式方法设置两小时后自动重启网站服务(使用管道命令)
[lh@LH_LINUX]$ echo "systemctl restart httpd" | at now +2 HOUR warning: commands will be executed using /bin/sh job 3 at Sat Mar 18 20:38:00 2023
时间参数MONTH(月)、DAY(日)、HOUR(时)和MINUTE(分)
eg: 删除计划任务[lh@LH_LINUX]$ at -l #查看一次性任务 3 Sat Mar 18 20:38:00 2023 a lh 1 Sat Mar 18 23:30:00 2023 a lh [lh@LH_LINUX]$ atrm 3 #删除第3条任务
-
长期性计划任务
eg: 创建两个自动化任务
-
使用命令
crontab -e
编辑自动化任务,在VIM编辑器里写入25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot #每周一、三、五的3:25分将目录数据进行打包 */2 * * * 1-5 /usr/bin/rm -rf /tmp/* #周一至周五每隔2分钟清空`/tmp`目录中的内容
格式:“分、时、日、月、星期 命令”
注意:
,
分别表示多个时间段,-
表示一段连续的时间周期,/
表示执行任务的时间间隔;计划中的“分”字段必须要有数值,“日”和“星期”字段不能同时使用,否则就会发生冲突 -
使用命令
crontab -l
可以再次查看自动化任务
eg: 删除自动化任务
使用命令
crontab -r
即可。 -