1.介绍
Linux中非常有用的功能, 这个功能叫做shell编程, shell脚本编程的基本元素就是我们使用的Linux命令, 把这些Linux命令组合在一起,就可以构成shell脚本.
2.应用背景
主要应用于Linux服务器上处理一些任务,如:批量操作,重复性任务,定时任务,自动化【对于大多数的应用场景都是用来实现运维的自动化】/
包括但不限于以下方面:
测试工具和内容自动化
log监视,服务死活监视
邮件自动发送,服务自动重启
3.学习
【章节】
01 | 什么是shell
02 | Linux的启动过程
03 | shell脚本的格式
04 | 脚本不同执行方式的影响
05 | 管道
06 | 重定向
07 | 变量赋值
08 | 变量引用即作为范围
09 | 环境变量、预定义变量与位置变量
10 | 环境变量与配置文件
shell脚本除了我们去编写, 系统本身也有很多shell脚本, 在系统启动的过程中就已经涉及到大量的shell脚本运行, 这里结合Linux的启动过程叙述一下. 如果我们想实现自己的任务, 就需要我们自己去编写shell脚本, 至于编写shell脚本需要哪些部分, 接来下会介绍, 以及编写的脚本如何执行, 内建命令和外建命令的区别.
1.1 什么是shell
shell是命令解释器, 用于解释用户对操作系统的操作,操作系统运行的本身其实并不需要人来控制。但需要告诉操作系统做什么,这个交互程序,就被称为shell。
shell会把用户所执行的命令翻译给我们的内核, 内核根据我们命令执行的结果返回给用户.
例如,我们使用shell去解释的ls命令, 底层过程是什么样的呢? // ls 显示目录和文件列表
当我们输入ls回车时, shell接收到ls命令, 之后ta对命令的选项和参数进行分析, 分析后, 我们知道ls是查看文件目录列表的, 第一步ta会交给我们的文件系统[在内核], 内核接收到命令, 根据文件系统把我们要查看的文件目录再翻译成对应的硬盘的某一个扇区, [SSD, 固态硬盘是另外一中结构], 翻译到硬件, 硬件会把我们查询的结果返回给内核, 内核返回给shell, shell再返回给用户.
ls底层过程:
用户输入命令--->shell[分析]---->文件系统[内核]----->硬件[硬盘]
用户<---shell<----文件系统[内核]<-----硬件[硬盘]
我们发现只要我们shell编写好, 用户是不用写驱动程序的, 也不用开发复杂的c语言, 通过一个简单的命令就可以控制内核, 以及控制内核去做很多我们自己想做的事情.这就是shell解释器最主要的功劳, 用户不用去了解底层的这些知识
1.2 shell 有很多
cat /etc/shells //查看shell分类
有bsh csh, tcsh, zsh //zsh有时是默认没有被安装的, 主要看安装方式
还有一种是bash, 也就是我们最常使用的, 这里的bash中a 是 again的缩写, 就是重写的意思, 即基于bsh, 把其他shell好用功能集成进来, 把bsh比较少用的功能给去掉,又重新写了一遍.
bash是centOS 7和Ubuntu默认shell. 所以我们也是常常用bash去做命令解释器.
【02 | Linux的启动过程】
我们来下系统自带的shell脚本都在哪里, 系统自带shell有两大用处, 第一大用处就是Linux系统启动过程, 启动过程中需要功能是可以通过shell来实现的, 第二大用处是Linux的很多命令也是shell脚本编写出来的.
Linux启动过程简单分为六个步骤:
BLOS --MBR---BootLoader(grub)---kernel--systemd--系统初始化--shell
详细介绍
BLOS引导, 视为基本的输入输出系统,在主板上面,通过blos去选择我们所要引导的介质, 引导的介质一般会有两种, 硬盘和光盘, 早期安装操作系统使用的是光盘, 现在安装操作系统, 更多使用的是网络去引导, 在正常启动过程中,经过blos就来到了我们的硬盘, 那这个硬盘是不是可引导的呢, 要看硬盘的主引导记录部分,这个部分叫做MBR, 如果硬盘是可引导的, 接下来就该进入Linux中这个过程, 这个过程我第一个引导的不是内核, 而是叫做grub[grub 2.0, 一般称为BootLoader]的软件,BootLoader, 主要是启动和引导内核的工具, 通过这个工具我们可以引导Linux内核, 甚至我们可以通过BootLoader可以去引导Windows启动, 如果只是Linux, 我们可以把ta简单地认为是选择哪个内核以及选择指定内核版本的, 确定了内核版本之后, 内核就开始启动了, 内核启动后, 会把系统做一个初始化, 以及通过驱动程序去加载各种各样的硬件, 再之后, 就是shell脚本可以工作了, 如果centOS 7, 第一个程序就是systemd, 一号进程, 如果是centOS 6 就是init 一号进程,
无论是systemd还是init,都被称作是一号进程, 如果是centOS 6 , 从init之后, 所有的引导的过程全都是shell脚本来完成的, 包括怎么去加载内核需要的模块, 包括怎样去启动网络, 这个功能都是由init然后后续跟着很多shell脚本完成的, 而在systemd中,有一部分是已经改为systemd的配置文件方式, 即使用应用程序去引导, 应用程序引导之后, 系统初始化过程仍然是Linux shell脚本.