Linux就该这么学 6 | Vim 编辑器与 Shell 命令脚本



一、Vim 文本编辑器

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

1. Vim 编辑器模式

vim 编辑器模式 说明
命令模式默认 控制光标移动,可对文本进行复制、粘贴、删除和查找等工作
编辑模式 正常的文本录入
末行模式 保存或退出文档,以及设置编辑环境
Vim 编辑器模式的切换方法

提示:

  • 在每次运行 Vim 编辑器时,默认进入命令模式,此时需要先切换到输入模式后再进行文档编写工作,而每次在编写完文档后需要先返回命令模式,然后再进入末行模式,执行文档的保存或退出操作
  • 在 Vim 中,无法直接从输入模式切换到末行模式
末行模式中可用的命令
  • 末行模式主要用于保存或退出文件,以及设置 Vim 编辑器的工作环境,还可以让用户执行外部的 Linux 命令或跳转到所编写文档的特定行数
命令 作用
: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 三个键从命令模式切换到输入模式

  • a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式
  • o 键则是在光标的下面再创建一个空行,此时可敲击 a 键进入到编辑器的输入模式

2. Vim 中常用的命令

命令 作用
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的 5 行
yy 复制光标所在整行
5yy 复制从光标处开始的 5 行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作
p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面

二、配置主机名称

为了便于在局域网中查找某台特定的主机,或者对主机进行区分,除了要有 IP 地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问

  • 修改主机名称文件
    vim /etc/hostname
  • 查看主机名
    hostname

三、配置网卡

网卡 IP 地址配置的是否正确是两台服务器是否可以相互通信的前提

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

提示:

  • 在 RHEL 5、 RHEL 6 中,网卡配置文件的前缀为 eth,第 1 块网卡为eth0,第 2 块网卡为 eth1,以此类推
  • 在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg开始,加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736;好在除了文件名变化外也没有其他大的区别

cd /etc/sysconfig/network-scripts
ls

vim ifcfg-ens33

默认

提示:

  • 配置为开机自启动,并且 IP地址、子网、网关等信息由人工指定
参数 说明
设备类型 TYPE=Ethernet
地址分配模式 BOOTPROTO=static
网卡名称 NAME=ens3
是否启动 ONBOOT=yes
IP 地址 IPADDR=192.168.10.10
子网掩码 NETMASK=255.255.255.0
网关地址 GATEWAY=192.168.10.1
DNS 地址 DNS1=192.168.10.1
  • 重启网卡设备
    systemctl restart network

四、配置 Yum 软件仓库

Yum 软件仓库的作用是为了进一步简化 RPM 管理软件的难度以及自动分析所需软件包及其依赖关系的技术

  • 进入yum配置文件夹
    cd /etc/yum.repos.d/
    ls
  • 新建rhel7.repo
    vim rhel7.repo

五、编写 Shell 脚本

工作方式 英文 说明
交互式 Interactive 用户每输入一条命令就立即执行
批处理 Batch 由用户事先编写好一个完整的 Shell 脚本, Shell 会一次性执行脚本中诸多的命令

1. 编写简单的脚本

  • 查看当前命令行终端解释器
    echo $SHELL
  • 查看当前所在工作路径并列出当前目录下所有的文件及属性信息
    vim test.sh
#!/bin/bash
#For Example BY Ricsy
pwd
ls -al

提示:

  • 第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本
  • 第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息
  • 第三、四行的可执行语句也就是我们平时执行的 Linux 命令了
  • 执行
    sh test.sh

    chmod +x test.sh
    ./test.sh

2. 接收用户的参数

Shell 脚本程序中的参数位置变量

提示:

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

如:

vim example.sh

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

sh example.sh one two three four five six

3. 判断用户的参数

按照测试对象来划分,条件测试语句可以分为 4 种:

1. 文件测试语句

文件测试所用的参数

运算符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

如:

  1. 判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在
    [ -d /etc/fstab ]
    echo $?
  1. 判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存
    在,且为一般文件
    [ -f /etc/fstab ]
    echo $?
2. 逻辑测试语句
  • &&表示当前面的命令执行成功后才会执行它后面的命令
  • ||表示当前面的命令执行失败后才会执行它后面的命令
  • !表示把条件测试中的判断结果取相反值

如:

  1. 判断当前登录的用户是否为非管理员用户
    [ ! $USER = root ] && echo "user" || echo "root"
3. 整数值比较语句

可用的整数比较运算符

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

如:

  1. 10 是否大于 10
    [ 10 -gt 10 ]
    echo $?
  1. 获取内存可用量
    free -m
    free -m | grep Mem:
    free -m | grep Mem: | awk '{print $4}'
FreeMem=`free -m | grep Mem: | awk '{print $4}'`

echo $FreeMem

使用整数运算符来判断内存可用量的值是否小于 1024,若小
于则会提示“Insufficient Memory”(内存不足)的字样
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"

4. 字符串比较语句
  • 判断测试字符串是否为空值,或两个字符串是否相同
  • 用来判断某个变量是否未被定义(即内容为空值)

常见的字符串比较运算符

运算符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空

如:

  1. 判断 String 变量是否为空值,进而判断是否定义了这个变量
    [ -z $String]
    echo $?
  1. 环境变量值 LANG 不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样
    [ $LANG!="en.US" ] && echo "Not en.US"

六、流程控制语句

1. if 条件测试语句

单分支的 if 语句

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


如:

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

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

如:

  1. 验证某台主机是否在线
    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

sh chkhost.sh 192.168.10.10

多分支的 if 语句

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


如:

多分支的 if 条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Error、Excellent、 Pass、 Fail 等提示信息
vim chkscore.sh

#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; then
echo "$GRADE is Error"
else
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
fi

sh chkscore.sh

提示:

  • 在 Linux 系统中, read 是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量, -p 参数用于向用户显示一定的提示信息

2. for 条件循环语句

for 循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用 for 循环语句再适合不过了

如:

1.使用 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

提示:

  • 执行批量创建用户的 Shell 脚本 Example.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。由于已经将多余的信息通过输出重定向符转移到了/dev/null 黑洞文件中,因此在正常情况下屏幕窗口除了“用户账户创建成功”(Create success)的提示后不会有其他内容
  • 在 Linux 系统中, /etc/passwd 是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建用户信息
  1. 从文本中自动读取主机列表,然后自动逐个测试这些主机是否在线
    vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12

vim CheckHosts.sh

#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /d
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done

3. while 条件循环语句

while 条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于 for 循环语句中有目标、有范围的使用场景。 while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环

如:

  1. 猜测数值大小
    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 "您总共猜 g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了! "
else
echo "太低了! "
fi
done

4. case 条件测试语句

case 语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令

vim Checkkeys.sh

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

七、计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务

一次性计划任务-at

  • 一次性计划任务只执行一次,一般用于满足临时的工作需求

提示:

  • 可以用 at命令实现这种功能
    at [时间]
  • 如果想要查看已设置好但还未执行的一次性计划任务
    at -l
  • 要想将其删除
    atrm [任务序号]
  • 在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法
  • Ctrl + D组合键来结束编写计划任务

at 23:30
systemctl restart httpd
at -l
atrm 1
at -l

echo "systemctl restart httpd" | at 23:30
at -l
atrm 1
at -l

长期性计划任务-crondtab

提示:

  • 创建、编辑计划任务的命令为
    crontab -e
  • 查看当前计划任务的命令为
    crontab -l
  • 删除某条计划任务的命令为
    crontab -r
  • 如果您是以管理员的身份登录的系统
    crontab -u
    来编辑他人的计划任务

分、时、日、月、星期

字段 说明
取值为 0~59 的整数
取值为 0~23 的任意整数
取值为 1~31 的任意整数
取值为 1~12 的任意整数
星期 取值为 0~7 的任意整数,其中 0 与 7 均为星期日
命令 要执行的命令或程序脚本

如:

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

crontab -e

25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

crontab -l

  1. 每周一至周五的凌晨 1 点钟自动清空/tmp 目录内的所有文件

crontab -e

0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

crontab -l

说明:

  • 除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、 9 月
    和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的 12~15 日)。以及用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2 分钟执行一次任务)
  • 在 crond 服务的配置参数中,可以像 Shell 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等要信息
  • 计划任务中的“分”字段必须有数值,绝对不能为空或是号,而“日”和“星期”字段不能同时使用,否则就会发生冲突
  • 在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,可以用type或whereis查看

更新中......


你可能感兴趣的:(Linux就该这么学 6 | Vim 编辑器与 Shell 命令脚本)