《Linux就该这么学》培训笔记_ch04_Vim编辑器与Shell命令脚本

文章最后会post上书本的笔记照片。

文章主要内容

Vim编辑器

Linux中一切都是文件,配置服务其实就是在修改其配置文件的参数。

Vim编辑器用于编辑文本文件内容,是vi编辑器的升级版,与Vi相比,Vim编辑器有代码着色。

Vim编辑器有3中模式:

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

运行Vim编辑器默认进入命令模式。按下a、i、o可进入输入模式进行文档编辑。按下Esc键退出当前模式并返回命令模式。按下:进入末行模式。输入模式和末行模式不能直接切换。

命令模式常用命令:

  • dd:删除(剪切)光标所在整行
  • ndd:删除(剪切)从光标处开始的n行。例子:10dd,即删除(剪切)从光标处开始的10行。1dd = dd(没有意义)
  • yy:复制光标所在整行
  • nyy:复制从光标处开始的n行。例子:7dd,即复制从光标处开始的7行。1yy = yy(没有意义)
  • n:显示搜索命令定位到的下一个字符串
  • N:显示搜索命令定位到的上一个字符串
  • u:撤销上一步的操作
  • p:将之前删除(dd)或复制(yy)过的数据粘贴到光标后面

a、i、o进入输入模式区别:

  • a键:在光标后一位切换;
  • i键:光标当前位置;
  • o键:光标下面在创建一个空行;

末行模式可用命令:

命令 作用
: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 /etc/hostname    #在Linux系统中,主机名大多保存在/etc/hostname文件中
kamin.com #把原始主机名删除后追加想要更改的主机名,按Esc键返回命令模式,按:进入末行模式执行wq!强制保存并退出

配置网卡信息:

  1. 首先切换到/etc/sysconfig/network-scripts目录中(存放着网卡的配置文件:ifcfg-enoXXXXXXXX);
  2. 使用Vim编辑器修改网卡文件ifcfg-enoXXXXXXXX,逐项写入下面的配置参数并保存退出。使用ifconfig命令可以确认网卡的默认名称。
  3. 重启网络服务并测试网络是否联通。
 cd /etc/sysconfig/network-scripts/    #切换到存放网卡配置文件的目录
vim ifcfg-eno16777728 #修改网卡配置文件参数
TYPE=Ethernet #设备类型
BOOTPROTO=static #地址分配模式,有dhcp,static和none
NAME=eno16777728 #网卡名称,用DEVICE参数也行
ONBOOT=yes #是否启动
IPADDR=192.168.10.10 #ip地址
NETMASK=255.255.255.0 #子网掩码,可以写成PREFIX=24
GATEWAY=192.168.10.1 #网关地址
DNS1=192.168.10.1 #DNS地址
systemctl restart network #重启网卡服务
ping 192.168.10.10 #测试连通性

配置Yum软件仓库

  • 1.添加光盘,检查光盘是否被识别;
  • 2.创建一个目录作为挂载点;
  • 3.用mount命令把光盘挂载到挂载点;
  • 4.进入/etc/yum.repos.d/目录,创建Yum仓库配置文件(xxx.repo,名字随意,但是后缀必须是repo),编辑好相关配置参数;
  • 5.把光盘的挂载信息追加写入到/etc/fstab文件中,使得该挂载信息永久生效。
 mkdir -p /media/cdrom                           #创建挂载点
mount /dev/cdrom /media/cdrom #把光盘挂载到/media/cdrom
cd /etc/yum.repos.d/ #进入到/etc/yum.repos.d/目录中
vim rhel7.repo #创建Yum仓库配置文件(文件名称随意,但后缀必须是.repo),5-9行是文件内容
[rhel7] #Yum软件仓库唯一标识符,避免与其他仓库冲突
name=rhel7 #Yum软件仓库的名称描述,易于识别仓库用处
baseurl=file:///media/cdrom #Yum软件仓库的路径。支持格式有FTP(ftp://..)、HTTP(http://)、本地(file:///)
enabled=1 #设置此源是否可用;1可用,0禁用
gpgcheck=0 #设置此源是否检验文件,1校验,0不校验
vim /etc/fstab #把挂载信息写入/etc/fstab,实现永久挂载。11行为文件的追加内容。
/dev/cdrom /media/cdrom iso9660 defaults 0 #设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检(1是0否)

Shell脚本

Shell脚本名称随意,但一般后缀为.sh,以表示是脚本文件。

Shell脚本格式:(脚本声明和脚本正文必须有,脚本注释可以没有)

 vim test.sh
#!/bin/bash #脚本声明,告诉系统用那种shell解释器执行该脚本
#This is a test program #脚本注释
pwd #脚本正文,常见命令配合流程控制语句等组成有一定功能的脚本程序
ls -l

运行Shell脚本方法

  • 1)bash 脚本文件所在位置/脚本文件名。ex:bash Desktop/test.sh
  • 2)./脚本文件所在位置/脚本文件名。这种方式需要有文件的执行权限(默认没有)。要用chmod命令为文件增加执行权限。
 bash Desktop/test.sh         #方法1:bash 脚本的相对位置。
./Desktop/test.sh #方法2:./脚本的相对位置。现在执行会报错,因为创建的脚本文件默认是没有执行权限的
chmod u+x Desktop/test.sh #为脚本文件增加属主的执行权限。
./Desktop/test.sh #现在执行就可以了。

Shell脚本内设的用于接收参数的变量

  • $0:当前Shell脚本程序的名称
  • $#:总共有几个参数
  • $*:所有位置的参数值
  • $?:显示上一次命令的执行返回值
  • $1、$2、$3...:分别对应着第N个位置的参数值

实例:

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

条件测试语句:[ 条件表达式 ]。两边均有空格,条件测试语句不能配合管道符。

文件测试语句参数:

操作符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
 [ -d /etc/fstab ]    #/etc/fstab是存放设备挂载信息的配置文件,不是目录,因此返回值为1
echo $? #返回上一条命令执行后的返回值
[ -e /etc/fstab ] #/etc/fstab文件是实打实存在的文件,返回值0
[ -f /etc/fstab ] #/etc/fstab是一般文件,返回0
[ -r /etc/fstab ] #/etc/fstab文件当前用户root是可读的,返回0
[ -w /etc/fstab ] #/etc/fstab文件当前用户root是可写的,返回0
[ -x /etc/fstab ] #/etc/fstab文件当前用户root是不可执行的,返回1

逻辑测试语句参数(返回0则成功,返回1则失败):

  • 逻辑与(&&):当前面的命令执行成功后才会执行后面的命令;
  • 逻辑或(||):当前面的命令执行失败后才会执行后面的命令;
  • 逻辑非(!):条件测试中的判断结果取反;
 [ ! $USER = root ] && echo "user" || echo "root"    #先判断当前登录用户的USER变量值是否为root,然后取反。即如果当前登录用户的USER变量值不为root,则输出user,反之输出root。

整数比较语句参数:

操作符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于

以下例子创建变量FreeMem,记录系统当前剩余内存量。先通过free -m命令查看内存使用量情况(以MB来显示),然后通过grep Mem:命令过滤出剩余内存量的那行,最后通过awk '{print $4}'命令只保留第4列(这里列按空格区分开)

 FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[ $FreeMem -lt ] && echo "内存不足" #如果FreeMem的值小于1024,则输出内存不足

字符串比较语句参数:

操作符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
 SB="zhouhw"
[ $SB != "liwh" ] && echo "zhou hong wei is SB" #如果SB不等于liwh,则输出zhou hong wei is SB

流程控制语句

if语句

单分支:if...then...fi

双分支:if...then...else...fi

ping命令:用于测试与对方主机的网络连通性。格式:ping [参数] 对方主机ip地址。

常用参数:

  • -c:规定尝试次数;
  • -i:定义数据包发送间隔;
  • -W:定义等待超时时间。

/dev/null:被称作Linux黑洞的文件,把输出重定向到这个文件等同于删除数据,让用户的屏幕窗口保持简洁。

 vim chkhost.sh
#!/bin/bash #脚本声明
ping -c -i 0.2 -W $1 &> /dev/null #测试看能否ping通对方主机ip,并将输出结果重定向到/dev/null中保持界面整洁
if [ $? -eq ] #如果$?为0则成功,说明能ping通对方主机,反之ping不通。
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi

多分支:if...then...elif...then...else...fi

 vim chkscore.sh
#!/bin/bash #脚本声明
read -p "Enter your score(0-100):" GRADE #read命令读取用户输入信息并赋值给后面指定变量GRADE,-p用于向用户显示一定的提示信息。
if [ $GRADE -ge ] && [ $GRADE -le ] ; then #如果85 ≤ GRADE ≤ 100,则Excellent
echo "$GRADE is Excellent"
elif [ $GRADE -ge ] && [ $GRADE -le ] ; then #如果70 ≤ GRADE ≤ 84,则Pass
echo "$GRADE is Pass"
else #兜底,即上面条件都不匹配,则执行这条之下的脚本
echo "$GRADE is Fail"
fi

for循环

for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行处理。

红帽考试:编写一个可以批量创建用户的Shell脚本。

 vim users.txt                                          #创建用户名称的列表文件
zhangsan
lisi
wangwu
vim Example.sh #编写批量创建用户脚本
#!/bin/bash #脚本声明
read -p "Enter The Users Password : " PASSWD #读取用户输入的信息,赋值给PASSWD变量
for UNAME in `cat users.txt` #cat命令读取文件users.txt,for循环开始先把第一行赋值给UNAME变量,依此类推。
do #for循环逻辑开始
id $UNAME &> /dev/null #id命令检查系统中是否存在此用户
if [ $? -eq ] ; then #根据上一次执行命令的结果是否为0,即如果该用户已存在,输出“已存在”,反之则创建该用户
echo "Already exists"
else
useradd $UNAME &> /dev/null #创建用户,并将输出结果重定向到黑洞文件保持界面整洁
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null #通过管道符传递的方法设置密码,免去passwd命令原本需要交互式设置的麻烦
if [ $? -eq ] ; then #虽然上两条命令基本上不会出错,但为了程序更严谨,还是要判断下命令是否执行成功,0成功非0失败,并分别输出相应提示信息。
17 echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi #里层if语句结束
fi #外层if语句结束
done #for循环结束

同理,批量ping对方主机的脚本思路类似。

while循环

若条件为真就继续执行,反之跳出循环。

实例:用多分支if语句配合while条件循环语句编写猜数字的小游戏脚本。

 vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % ) #使用$RANDOM变量来调取出一个随机的数值(范围为0~32767),将这个随机数对1000进行取余操作,并使用expr命令取得其结果
TIMES=0 #创建TIMES变量,用于累计用户猜数字的次数
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true #条件永远为真,循环会无限执行下去,下面会有exit 0语句终止脚本执行
do #循环开始
read -p "请输入您猜测的价格数目:" INT #read读取输入的数值
let TIMES++ #TIMES变量自增1,即猜数字次数累计1次
if [ $INT -eq $PRICE ] ; then #如果输入的数字跟随机生成的数字一致,说明猜对了。(第三行生成的数字不在循环内,因此知道程序结束,生成的数字都是不会变的)
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit 0 #终止脚本执行
elif [ $INT -gt $PRICE ] ; then #输入数字比生成数字高,提示太高
echo "太高了!"
else #兜底,既猜不对数字,又不是比生成数字高,那就是太低了
echo "太低了!"
fi #if语句结束
done #while循环结束

该脚本只能接收数字,如果输入数字以外的字符,脚本就会奔溃并报错,并判断条件一定跳到兜底,输出“太低了”。

case语句

实例:用case语句和通配符判断用户输入的字符是数字、字母还是其他字符。

 vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY #read读取用户输入信息
case "$KEY" in #case语句开始
[a-z]|[A-Z]) #如果输入的字符(只能是1位,aD则会跳到兜底)是大写字母或者小写字母,则输出是字母
echo "您输入的是 字母。"
;; #是否为字母的判断逻辑结束
[-]) #如果是数字(只能1位,10、99等则会跳到兜底),则输出是数字
echo "您输入的是 数字。"
;; #是否为数字的判断逻辑结束
*) #兜底,输出其他字符
echo "您输入的是 空格、功能键或其他控制字符。"
esac #case语句结束

计划任务服务程序

计划任务可以在指定的时间段自动启动或停止某些服务或命令,实现运维的自动化。

计划任务:

  • 一次性计划任务:只执行一次,一般用于临时的工作需求。
  • 长期性计划任务:按照设定的时间周期,重复执行用户指定的命令操作。

at命令:用于设置一次性计划任务。格式:at [时间]/[参数]。

at命令常见用法:

 at :30                                       #at 24小时制时间 命令在当天23:30设置一个一次性计划任务,下面进入到at命令的交互式设置
at > systemctl restart network #浅蓝色为at命令交互式设置的默认开头,后面可以编辑相应命令,这里是设置了重启网卡服务的命令
at > 按下Ctrl + D结束编写计划任务 #如果计划任务编写完了,不要按Ctrl + C,这样会在没有保存计划任务的情况下强行退出at交互式设置。要按Ctrl + D来保存相关设置并退出at计划任务设置。
echo "systemctl restart network" | at :30 #通过管道符的方式设置计划任务,跟前面通过交互来设置的效果一样
at -l #at -l查看已设置好但还没执行的一次性计划任务,已执行的一次性计划任务会自动删除,所以已执行的一次性计划任务在这里是查不到的。其中列出信息的第一列表示任务序号。
atrm 1 #atrm 任务序号 删除对应任务序号的一次性计划任务。任务序号是按一次性计划任务的设置顺序来递增赋予的。
at -l #再查看一次已设置好但还没执行的一次性计划任务,会发现任务序号为1的计划任务已经不见了。

Linux中默认启用的crond服务是用来周期性的执行某种任务或等待处理某些事件的一个守护进程。crond服务通过crontab命令来实现。

crontab命令:用于配置周期性计划任务。格式:crontab [选项]。

常用参数:

  • -e:创建、编辑计划任务;
  • -l:查看当前计划任务;
  • -r:删除某条计划任务;
  • -u:编辑对应用户的计划任务(管理员身份才能用);

使用crond设置任务的参数格式:分 时 日 月 星期 命令,如果有些字段没有设置,则使用星号(*)占位。

注意:

  • “分”字段必须有数值,不能为空或者是*号;
  • “日”和“星期”字段不能同时使用,否则会发生冲突;
字段 说明
分钟 取值为0~59的整数
小时 取值为0~23的任意整数
日期 取值为1~31的任意整数
月份 取值为1~12的任意整数
星期 取值为0~7的任意整数,其中0与7均为星期日
命令 要执行的命令或程序脚本

实例:

  • 1.先创建一个周期性计划任务,实现在每周一、三、五的凌晨3点25分把root用户桌面打包作为一个备份文件;
  • 2.查看当前计划任务内容,再编辑计划任务,追加一条计划任务,实现在每周一到周五的凌晨1点钟把/tmp/目录下所有文件删掉;
 crontab -e                                                      #进入周期性计划任务编辑界面,其实就是调用了Vim编辑器
* * ,, /usr/bin/tar -czvf backup,tar,gz /root/Desktop #写入周期性计划任务设置信息,在crond服务的计划任务参数中,所有命令必须使用绝对路径的方式来写,whereis命令可以查询命令的绝对路径。
crontab -l #查看当前计划任务
crontab -e #再次进入计划任务编辑,追加计划内容
* * - /usr/bin/rm -rf /tmp/*

书本笔记

《Linux就该这么学》培训笔记_ch04_Vim编辑器与Shell命令脚本的更多相关文章

  1. Linux 就该这么学 CH04 VIM编辑器和Shell命令脚本

    0 概述 1 Vim编辑器 在linux 中一切都是文件,而配置一个服务就是修改其配置文件的参数. vim 编辑器有三种模式:命令模式,末行模式和编辑模式. 命令模式:控制光标移动,对文件进行操作. ...

  2. Linux就该这么学28期——Day05 vim编辑器与Shell命令脚本 (yum配置 网卡配置)

    vim 三种模式: 命令模式 按行操作 dd 剪切.删除 5dd dG   全删 yy 复制光标所在行 p 粘贴 u 撤销操作 / 搜索 /ab n  下一个 N   上一个 输入模式 a 当前光标处 ...

  3. Linux 学习笔记 基本的bash shell命令

    Linux 文件系统 Linux讲文件存储在单个目录结构(虚拟目录)中,虚拟目录包含了安装在PC上的所有存储设备的文件路径. Linux虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备.Linu ...

  4. Linux学习第一天————了解root用户和基本的shell命令

    一.了解Linux中的root用户  1.1root用户 使用过MySQL的同学都知道MySQL中有一个变态的存在叫做超级管理员,他可以从操作任何一个数据库,那么在Linux中也有这么一个变态的存在他 ...

  5. 《linux就该这么学》第三节课 第二节命令笔记

    命令笔记 (随笔原创,借鉴请修改) linux系统中一切都是文件 2.4  系统状态的命令:  ifconfig   :    查看系统网卡信息,包括网卡名称,ip地址,掩码,mac地址,收到数据包大 ...

  6. Linux 学习笔记 更多的bash shell命令

    一  监测程序 1.ps 输出运行在系统上的所有程序的许多信息 运行ps命令,也会开启一个进程 默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程. Unix风格的参数(单破折号) - ...

  7. [嵌入式培训 笔记]-----Vim编辑器使用简介

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 第一讲小结 1. 光标在屏幕文本中的移动既 ...

  8. Linux就该这么学 20181003(第四章Vim/shell/测试条件)

    参考链接https://www.linuxprobe.com/ vim文本编辑器 命令模式:控制光标移动,可对文本进行复制,黏贴,删除和查找工作 输入模式:正常的文本录入 末行模式:保存或退出文档,以 ...

  9. LInux 就该这么学 笔记分享

    看了Linux就该这么学的前部分书,觉得写的还可以,就在网上找了下面这个同学写的笔记,觉得很详细,所以保存地址,供以后查阅参看.这里对作者表示感谢!!! 博客地址: https://www.cnblo ...

随机推荐

  1. 有趣的css图形实现

    css通过 border .border-radius .transform,实现各种图形. <!DOCTYPE html> <html lang="en"> ...

  2. 2019 vs 如何升级到.net core 3.0 版本

    写在前面 看到微软的官网都已经更新.NET CORE 3.0的版本了.发现自己的还是.NET CORE 2.1X 的版本. 那应该如果升级到.NET CORE 3.0 的版本呢? 思考 [1]首先,我 ...

  3. 在<a></a>标签中如何调用javaScript脚本

    在日常工作总会遇到在<a>标签中执行js代码的情况 现在做一个总结,希望对大家有一个帮助. 1.a href="javascript:js_method();" 这是我 ...

  4. 深入解析 Go 中 Slice 底层实现

    原文: https://halfrost.com/go_slice/   切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合.切片的设计想法是由动态数组概念而来,为了开发者可以更加 ...

  5. 在AWS中自定义Credential Provider实现Client连接

    今天在使用AWS中,由于原来的 key和secrect是放在配置文件ini里面的.现在需要改成从DB里面获取,所以需要自定义Credential.在AWS中重写这个挺简单的. 我这里是继承原先的Cre ...

  6. English--比较结构

    English|比较结构 接下来让我们一起来透析,英语中的比较结构.各位同学,带上小板凳,要认真哦~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感 ...

  7. html书写行内元素时-tab和换行会在行内元素间引入间距

    目录 html文本中的控制字符会被解析为文本节点 书写行内元素时,换行符LF与水平制表符HT会引入莫名的元素间间隔 其他控制字符是否会引入间距的验证 html文本中的控制字符会被解析为文本节点 举例: ...

  8. JavaScript的Proxy可以做哪些有意思的事儿

    摘要: 神奇而有趣的Proxy. 原文:拿Proxy可以做哪些有意思的事儿 作者:贾顺名 Fundebug经授权转载,版权归原作者所有. Proxy是什么 首先,我们要清楚,Proxy是什么意思,这个 ...

  9. SwitchGame---MybatisPLus

    //实体类package com.example.spring.entity; import cn.afterturn.easypoi.excel.annotation.Excel;import cn ...

  10. linux中find命令的使用详解(转载)

    常用命令 find  (目录)   [-type d | f]  (文件夹 | 文件)   -name   (名称,可使用正则表达式) find  /root  -name "*core&q ...