Vim编辑器与Shell脚本
Vim编辑器和Shell脚本
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
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
简单编写文本
一进入vim编辑器中默认使用的是命令模式,可使用a、i、o三个键从命令模式切换到输入模式。:切换到末行模式。
在输出模式下,切换其他模式,需要先按Esc,在进行命令切换。
配置主机名称
主机名所在位置 /etc/hostname
ji@ji-virtual-machine:~$ vim /etc/hostname
配置网卡信息
网卡配置文件所在地:
ubuntu的网卡配置未知
应该在etc文件夹之下把
待补
配置Yum软件仓库
# ubuntu并不支持.的写法
ji@ji-virtual-machine:~$ cd /etc.yum.repos.d
bash: cd: /etc.yum.repos.d: 没有那个文件或目录
### 具体vim编写内容
[rhe17] # Yum软件仓库唯一标识
name=rhe17# Yum软件仓库的名称描述,易于识别仓库用处
baseurl=file://media//cdrom # 提供的方式包括http,ftp,file(本地)
enabled=1 # 设置此源是否可用,1为可用,0为禁用
gpgcheck=0 # 设置此源是否为校验文件,1为校验,0为不校验。
## 具体代码
root@ji-virtual-machine:/etc/yum/repos.d# vim rhel7.repo
root@ji-virtual-machine:/etc/yum/repos.d# mkdir -p /media/cdrom
root@ji-virtual-machine:/etc/yum/repos.d# mount /dev/cdrom /media/cdrom
mount:块设备 /dev/sr0 写保护,将以只读方式挂载
root@ji-virtual-machine:/etc/yum/repos.d# vim /etc/fstab # 这里我并不会设置
root@ji-virtual-machine:/etc/yum/repos.d# yum install httpd
file://media//cdrom/repodata/repomd.xml: [Errno 14] Could not open/read file://media//cdrom/repodata/repomd.xml
尝试其他镜像。
错误:Cannot retrieve repository metadata (repomd.xml) for repository: rhe17. Please verify its path and try again
root@ji-virtual-machine:/etc/yum/repos.d#
编写Shell脚本
两种工作模式:
交互式和批处理。
shell使用Bash错位命令行终端解释器
root@ji-virtual-machine:/etc/yum/repos.d# echo $SHELL
/bin/bash
编写shell脚本
.sh文件就是该脚本文件,可用vim编写
简单例子:
查看当前所在工作路径并列出当前目录下所有的文件及属性信息
vim example.sh
#!是脚本申明
# 是脚本注释
#!/bin/bash
pwd
ls -al
# 执行脚本
root@ji-virtual-machine:/etc/yum/repos.d# bash example.sh
/etc/yum/repos.d
总用量 20
drwxr-xr-x 2 root root 4096 12月 1 16:41 .
drwxr-xr-x 3 root root 4096 4月 17 2021 ..
-rw-r--r-- 1 root root 23 12月 1 16:41 example.sh
-rw-r--r-- 1 root root 69 12月 1 16:28 rhe17.repo
-rw-r--r-- 1 root root 69 12月 1 16:30 rhel7.rep
另外一种执行的方法
输出完整的路径来执行
root@ji-virtual-machine:/etc/yum/repos.d# ./example.sh
bash: ./example.sh: 权限不够
但经常权限不够,可以为该文件增加执行权限,下一章中有说为文件增加权限
接收用户的参数
$0对应当前shell脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有未知的参数值,$?对应的是吓死你hi上一次命令的执行返回值。$1 $2分别对应着第N个未知的参数值
# 编写参数是这样,但输出不来
echo"fengexian=======fengeixan"
echo"This is $0"
echo"all $# ,they ary $*"
echo "The first is $1 ,Second is $6"
#执行命令语句;用bash或sh都是如此
root@ji-virtual-machine:/etc/yum/repos.d# sh example.sh one three
example.sh: 4: example.sh: echofengexian=======fengeixan: not found
example.sh: 5: example.sh: echoThis is example.sh: not found
example.sh: 6: example.sh: echoall 2 ,they ary one three: not found
The first is one ,Second is
判断用户的参数
测试语句格式:[ 条件表达式 ] []内两边有空格
按测试对象划分:
文件测试语句
逻辑测试语句
整数值比较语句
字符串比较语句
文件测试所用的参数
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读入
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
例子
# -d的返回值为0的话则目录存在,为1的话不存在
root@ji-virtual-machine:/etc# [ -d etc/fastdb ]
# Shell解释器的内设$?变量显示上一条命令执行后的返回值
root@ji-virtual-machine:/etc# echo $?
1
# -f的话同样如此,作用在文件上
逻辑语句对测试结果进行逻辑分析
&&的话就是前面成功才会执行后面,同样,判断时候若前面为False,则后面不用看了。
逻辑或||
逻辑非!
可用的整数比较运算符
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否等于或大于
例子
root@ji-virtual-machine:~# [ 10 -gt 10 ]
root@ji-virtual-machine:~# echo $?
1
root@ji-virtual-machine:~# [ 10 -et 10 ]
bash: [: -et: 期待二元表达式
root@ji-virtual-machine:~# [ 10 -gt 10 ]
root@ji-virtual-machine:~# echo $?
1
实例查看当前内存剩余量
free -m
常见的字符串比较运算符
=等于
!=不等于
-z 判断字符串内容是否为空
实例判断当前语系的环境变量
root@ji-virtual-machine:~# echo $LANG
zh_CN.UTF-8
root@ji-virtual-machine:~# [ $LANG!="en.US" ]&& echo "NOt en.US"
NOt en.US
流程控制语句
if条件测试语句
echo "please input your age:"
read age
if ["$age"-gt"20"];then # 将输入的年龄与20作对比
echo "age is more than 20"
else
echo "age is less than 20"
fi
for循环语句
for loop in 1 2 3 4 5 6 # 使用for循环输出in后面的数字
do
echo "The value is:$loop" # 输出数字
done
while条件循环语句
int=1 # 初始化变量
while(($int<=5)) # 判断变量的取值范围
do
echo $int
let "int++" # 变量迭代
done
case条件测试语句
read -p "press some key,then press return:" KEY
case $KEY in # case语句后必须有in,每一个模式必须以右括号结束")"
[a-z]|[A|Z])
echo "It's a letter."
;;# 命令序列结束
[0-9])Q
echo "It's a digit."
;;
*)# 表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行"*)"后的命令序列
echo "It's function keys、Spacebar or other ksys."
esac
计划任务服务程序
计划任务分为一次性计划任务
只执行一次,使用”at 时间“形式就可以
查看计划任务,未执行的"at -l"
删除,可以用" atrm 任务序号"
使用"at xx"命令终端默认都是采用交互式方法
root@ji-virtual-machine:~# at 23:30
warning: commands will be executed using /bin/sh
at> echo "hello world"
at> <EOT>
job 1 at Wed Dec 1 23:30:00 2021
root@ji-virtual-machine:~# at -l
1 Wed Dec 1 23:30:00 2021 a root
# 删除任务
root@ji-virtual-machine:~# atrm 1
长期性计划任务
使用crond服务(linux默认启用),
查看 “crontab -l”
删除 " crontab -r"
管理员登陆的话,可以使用-u参数来编辑他人的计划任务
分时日月星期
crond设置任务的参数字段说明
分 0~59
时 0~23
日 1~31
月 1~12
星期 0~7的任意整数,其中0与7均为星期日
例子
corontab -e创建计划任务
可我进入之后就退不出来了;有可能后面没加执行命令的路径。
root@ji-virtual-machine:~# crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]: 1
888
分时日月星期用空格隔开
但是可以用逗号表示多个时间段,可以用减号表示一段连续的时间(12-15可用来表示每月的12-15号)
用除号(/)表示执行任务的间隔时间(*/2表示每隔2分钟执行)
在计划任务时,命令路径需以绝对路径来写,whereis查看路径。
tips笔记:linux就该这样学