4. Vim编辑器与Shell命令脚本

Vim 编辑器中设置了三种模式—命令模式、末行模式和编辑模式。

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

在每次运行 Vim 编辑器时,默认进入命令模式,此时需要先切换到输入模式后再进行文档编写工作,而每次在编写完文档后需要先返回命令模式,然后再进入末行模式,执行文档的保存或退出操作。在 Vim 中,无法直接从输入模式切换到末行模式。

4.1 Vim文本编辑器

4.1.1 编写简单文档

[hwj@localhost ~]$ vim practice.txt

如果存在该文档,则是打开它。如果不存在,则是创建一个临时的输入文件。打开 practice.txt 文档后,默认进入的是 Vim 编辑器的命令模式。可以分别使用 aio 三个键从命令模式切换到输入模式。其中, a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 o 键则是在光标的下面再创建一个空行,并进入到编辑器的输入模式。在编写完之后,想要保存并退出,必须先敲击键盘 Esc 键从输入模式返回命令模式。

4.1.2 配置主机名称

在 Linux系统中,主机名大多保存在/etc/hostname 文件中,修改文件内容即可修改主机名称。

hostname 命令用于查看当前的主机名称,但有时主机名称的改变不会立即同步到系统中,所以如果发现修改完成后还显示原来的主机名称,可重启虚拟机后再行查看。

[hwj@hwjsLinux ~]$ hostname
hwjsLinux
[hwj@hwjsLinux ~]$ cat /etc/hostname
hwj's Linux

4.1.3 配置网卡信息

/etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)。

systemctl restart network 命令重启网卡设备

ping 命令测试网络能否联通

4.1.4 配置Yum软件仓库

/etc/yum.repos.d/目录中(因为该目录存放着 Yum 软件仓库的配置文件)

4.2 编写Shell脚本

可以将 Shell 终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与 Linux 系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。

Shell 脚本命令的工作方式有两种:交互式和批处理。

  • 交互式(Interactive):用户每输入一条命令就立即执行。
  • 批处理(Batch):由用户事先编写好一个完整的 Shell 脚本, Shell 会一次性执行脚本中诸多的命令。

查看 SHELL 变量可以发现当前系统已经默认使用 Bash 作为命令行终端解释器了:

[root@hwjsLinux yum.repos.d]# echo $SHELL
/bin/bash

4.2.1 编写简单的脚本

[root@linuxprobe ~]# vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al

Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh 后缀加上,以表示是一个脚本文件。在上面的这个 example.sh 脚本中实际上出现了三种不同的元素:第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本;第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;第三、四行的可执行语句也就是我们平时执行的 Linux 命令了。

4.2.2 接收用户的参数

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

[hwj@hwjsLinux ~]$ cat example.sh
#!/bin/bash
echo "name is $0"
echo "total $# params, they are $*"
echo "first param is $1, three is $3" [hwj@hwjsLinux ~]$ bash example.sh one two three four
name is example.sh
total 4 params, they are one two three four
first param is one, three is three

4.2.3 判断用户的参数

Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。条件测试语法的执行格式如图 所示。切记,条件表达式两边均应有一个空格。

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

  • 文件测试语句;
  • 逻辑测试语句;
  • 整数值比较语句;
  • 字符串比较语句。

文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符

通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值

## 测试文件是否为目录类型
[hwj@hwjsLinux ~]$ [ -d /etc/fstab ]
[hwj@hwjsLinux ~]$ echo $?
1 ## 测试文件是否为一般文件
[hwj@hwjsLinux ~]$ [ -f /etc/fstab ]
[hwj@hwjsLinux ~]$ echo $?
0

逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。

  • 逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令
  • 逻辑“或”,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令
  • 逻辑语句是“非”,在 Linux 系统中的运算符号是一个叹号!,它表示把条件测试中的判断结果取相反值。
[hwj@hwjsLinux ~]$ echo $USER
hwj
[hwj@hwjsLinux ~]$ [ $USER = hwj ] && echo 'true'
true
[hwj@hwjsLinux ~]$ [ $USER != hwj ] || echo 'true'
true
[hwj@hwjsLinux ~]$ [ ! $USER = hwj ] || echo 'true'
true
[hwj@hwjsLinux ~]$ [ ! $USER = root ] && echo "not root" || "root"
not root

整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作。

[hwj@hwjsLinux ~]$ [ 10 -gt 10 ]
[hwj@hwjsLinux ~]$ echo $?
1
[hwj@hwjsLinux ~]$ [ 10 -eq 10 ]
[hwj@hwjsLinux ~]$ echo $?
0

字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。

[hwj@hwjsLinux ~]$ echo $String

[hwj@hwjsLinux ~]$ [ -z $String ]
[hwj@hwjsLinux ~]$ echo $?
0
[hwj@hwjsLinux ~]$ echo $LANG
en_US.UTF-8
[hwj@hwjsLinux ~]$ [ -z $LANG ]
[hwj@hwjsLinux ~]$ echo $?
1

4.3 流程控制语句

4.3.1 if 条件测试语句

if 语句分为单分支结构、双分支结构、多分支结构;

  • if 条件语句的单分支结构由 if、 then、 fi 关键词组成
  • if 条件语句的双分支结构由 if、 then、 else、 fi 关键词组成
  • if 条件语句的多分支结构由 ifthenelseeliffi 关键词组成
[hwj@hwjsLinux ~]$ cat test.sh
#!/bin/bash
read -p "Enter your score(0-100):" GRADE
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 [hwj@hwjsLinux ~]$ bash test.sh
Enter your score(0-100):90
90 is Excellent

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

4.3.2 for 条件循环语句

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

使用id命令查看用户的信息

/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱)

在 Linux 系统中, /etc/passwd 是用来保存用户账户信息的文件。

脚本中出现的$(命令)是一种完全类似于转义字符中反引号【`命令`】的 Shell 操作符,效果同样是执行括号或双引号括起来的字符串中的命令。

[hwj@hwjsLinux ~]$ cat CheckHost.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done [hwj@hwjsLinux ~]$ bash CheckHost.sh
Host 192.168.10.10 is Off-line.
Host http://www.baidu.com is Off-line.
Host 127.0.0.1 is On-line.

4.3.3 while 条件循环语句

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

[hwj@hwjsLinux ~]$ cat Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "Price is between 0-999, Guess it"
while true
do
read -p "Pleas Enter Num you Guess:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "TRUE, Price is $PRICE"
echo "Guess $TIMES times"
exit 0
elif [ $INT -gt $PRICE ]; then
echo "HIGHER!!!"
else
echo "LOWER!!!"
fi
done

4.3.4 case 条件测试语句

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

[hwj@hwjsLinux ~]$ cat CheckKeys.sh
#!/bin/bash
read -p "Please Enter a character:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "Alpha"
;; [0-9])
echo "Number"
;; *)
echo "Other"
esac

4.4 计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务,大家可以按照如下方式理解。

  • 一次性计划任务:今晚 11 点 30 分开启网站服务。
  • 长期性计划任务:每周一的凌晨 3 点 25 分把/home/wwwroot 目录打包备份为backup.tar.gz

如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令;要想将其删除,可以用“atrm 任务序号”。在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法。

[hwj@hwjsLinux ~]$ at 23:00
at> systemctl restart httpd
at> <EOT>
job 4 at Thu Dec 5 23:00:00 2019
You have new mail in /var/spool/mail/hwj
[hwj@hwjsLinux ~]$ at -l
2 Thu Dec 5 23:30:00 2019 a hwj
4 Thu Dec 5 23:00:00 2019 a hwj
[hwj@hwjsLinux ~]$ atrm 2
[hwj@hwjsLinux ~]$ at -l
4 Thu Dec 5 23:00:00 2019 a hwj
## 以非交互式方式创建一次性任务
[hwj@hwjsLinux ~]$ echo "systemctl restart httpd" | at 23:05
job 5 at Thu Dec 5 23:05:00 2019
[hwj@hwjsLinux ~]$ at -l
4 Thu Dec 5 23:00:00 2019 a hwj
5 Thu Dec 5 23:05:00 2019 a hwj

crond 服务创建周期性地、有规律地执行某些具体的任务。创建、编辑计划任务的命令为crontab -e,查看当前计划任务的命令为crontab -l,删除某条计划任务的命令为crontab -r。另外,如果您是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务。

除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、 9 月和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的 12~15 日)。以及用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2 分钟执行一次任务)

crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用 whereis 命令进行查询, rm 命令路径为下面输出信息中加粗部分。

在工作中使用计划服务的注意事项。

  • crond 服务的配置参数中,可以像 Shell 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
  • 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,“日”和“星期”字段不能同时使用,否则就会发生冲突。

20191209 Linux就该这么学(4)的更多相关文章

  1. 20191209 Linux就该这么学(6)

    6. 存储结构与磁盘划分 6.1 一切从"/"开始 Linux 系统中的一切文件都是从"根(/)"目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存 ...

  2. 20191209 Linux就该这么学(5)

    5. 用户身份与文件权限 5.1 用户的身份和能力 Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID( User IDentificati ...

  3. 20191209 Linux就该这么学(1-3)

    1. 部署虚拟环境安装 Linux 系统 RPM 是为了简化安装的复杂度,而 Yum软件仓库是为了解决软件包之间的依赖关系. 2. 新手必须掌握的Linux命令 通常来讲,计算机硬件是由运算器.控制器 ...

  4. 20191209 【归档】Linux就该这么学

    学习背景 因为打算学习Redis和Docker,但是发现对Linux的操作已经完全忘记了,所以选择再学一次,但是不会深入的学习,选择了<Linux就该这么学>这本书,学完了感觉还挺好,但是 ...

  5. 浅谈《Linux就该这么学》

    就在去年十月份的时候,偶尔在Linux技术群了看到别人分享的<Linux就该这么学>,好奇的就点进去看看,当时看完首页,突然发现刘遄老师说到心坎里去了,于是就仔细看了看红帽认证的讲解以及后 ...

  6. 《Linux就该这么学》 - 必读的红帽系统与红帽linux认证自学手册

    <Linux就该这么学>   本书作者刘遄从事于linux运维技术行业,较早时因兴趣的驱使接触到了Linux系统并开始学习. 已在2012年考下红帽工程师RHCE_6,今年又分别考下RHC ...

  7. 《Linux就该这么学》第十九天课程

    今天对“Linux就该这么学”课程做个收尾 最后一张使用LNMP架构部署动态网站环境 第1步:下载及解压源码包文件.为了方便在网络中传输,源码包文件通常会在归档后使用gzip或bzip2等格式进行压缩 ...

  8. 《Linux就该这么学》

    参加了第19期课程的培训,感谢刘老师的辛苦付出,课程讲的很好,真心推荐老刘的这本书真是<Linux就该这么学>!!! 本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的 ...

  9. 《linux就该这么学》开课,linux之路新开始

    今天开课第一天,虽然不会有实实在在的干货知识,只要是了解一下linux和认证.所以我也简单说一下我的linux之路 linux我是无意接触到的,因为工作,我接触的服务器较多,但是都是linux系统,记 ...

随机推荐

  1. Acwing-284-金字塔(区间DP)

    链接: https://www.acwing.com/problem/content/description/286/ 题意: 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. ...

  2. Qt5多线程

    方法一:重写run函数 一.线程执行过程: 1.在工程中自定义一个类mythread继承与QThread: 2.重写run函数: 3.创建线程对象: 4.写按钮槽函数: ui界面加入一个按钮 给按钮添 ...

  3. 无法将 DBNull.Value 强制转换为类型“System.DateTime”。请使用可空类型

    取数据库中的数据时,数据库中的字段有可能是空值,虽然Linq中的Field方法和SetField方法都可以处理可以为 null 的类型,不必像前面的示例那样检查 Null 值,我们再用Field将一些 ...

  4. wx小程序知识点(七)

    七.小程序提速与性能优化 参考大佬vicyao的文章 https://blog.csdn.net/wetest_tencent/article/details/61196522 (1)提高页面加载速度 ...

  5. 数据库范式以及ER图

    数据库范式包括第一.第二.第三以及BCNF范式,关于范式的探讨,博主在知乎上看见了一篇很不错的文章,分享文中,这边就不再做阐述.地址:https://www.zhihu.com/question/24 ...

  6. 一组相关联的问题:“sudo: unable to resolve host ###: Connection timed out”、软件启动速度超慢、IPv6无法使用

    造冰箱的大熊猫@cnblogs 2018/9/15 近日陆续发现计算机出现几个问题,最终发现这些问题实际上是由同一个原因导致的 问题1:无法使用IPv6 问题2:无论是启动Emacs GUI还是在命令 ...

  7. Codeforces #499 E Border ( 裴蜀定理 )

    题目链接 题意 : 给出 N 种纸币.并且给出面值.每种纸币的数量可以任选.问你得出来的数在 k 进制下.末尾位的数有多少种可能.输出具体方案 分析 : 纸币任意选择组成的和 可以用一个一次多项式来表 ...

  8. django + jquery 实现二级联动

    二级联动用ajax还是很好实现的,下面简单给个例子 jquery代码 $("#id_sel").change(function(){ $.get("/browser/ge ...

  9. python实现一个层次聚类方法

    层次聚类(Hierarchical Clustering) 一.概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类 ...

  10. oracle中更新关键字merge和 with as关键字

    merge是oracle特有的语句,两表关联操作(增.删.改)就效率非常高 merge into table_name alias1 using (table|view|sub_query) alia ...