Linux 运维工程师(OPS)–Shell基础
一、 常用的Shell有哪些?
Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器
1.1 bash
bash是Linux标准默认的shell,本教程也基于bash讲解。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。
Linux使用它作为默认的shell是因为它有诸如以下的特色:
- 可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。
- 自动通过查找匹配的方式给出以某字符串开头的命令。
- 包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。
1.2 sh
sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
1.3 ash
ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
1.4 csh
csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。
1.5 ksh
ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
二、 Shell命令的基本格式
2.1 echo 命令
2.1.1、基础操作简介
用来输出一个字符串,默认输出完成后会换行;给它增加-n选项,就不会换行了
2.1.2、控制选项
2.1.3、示例
2.2 read 命令
用来读取用户输入的数据,并把读取到的数据赋值给一个变量;-n选项表示读取固定长度的字符串,那么它后面必然要跟一个数字用来指明长度,否则选项是不完整的。
三、Shell命令的本质到底是什么?如何自己实现一个命令?
3.1 内置命令
Shell 内置命令的本质是一个自带的函数,执行内置命令就是调用这个自带的函数。因为函数代码在 Shell 启动时已经被加载到内存了,所以内置命令的执行速度很快。
3.2 外部命令
- Shell外部命令的本质是一个应用程序,执行外部命令就是启动一个新的应用程序。因为要创建新的进程并加载应用程序的代码,所以外部命令的执行速度很慢。
- 在外部命令的本质条件下,通过自己编写c语言程序并放到环境变量下可以在任意路径进行执行该程序,即该编译后的程序成为了Linux的一条命令
四、Shell命令的选项和参数在本质上到底是什么?
- 一个 Shell内置命令就是一个内部的函数,一个外部命令就是一个应用程序。内置命令后面附带的所有数据(所有选项和参数)最终都以参数的形式传递给了函数,外部命令后面附带的所有数据(所有选项和参数)最终都以参数的形式传递给了应用程序。
- 不管是内置命令还是外部命令,它后面附带的数据最终都以参数的形式传递给了函数。实现一个命令的一项重要工作就是解析传递给函数的参数
- 在函数内部,减号-可以用来区分该参数是否是命令的选项
五、Linux Shell命令提示符
5.1 第二层命令提示符
有些命令不能在一行内输入完成,需要换行,这个时候就会看到第二层命令提示符。第二层命令提示符默认为 " > "
补充:echo 命令用来输出一个字符串。字符串是一组由" “包围起来的字符序列,echo 将第一个"作为字符串的开端,将第二个"作为字符串的结尾。对于第二个 echo 命令,我们将字符串分成多行,echo 遇到第一个"认为是不完整的字符串,所以会继续等待用户输入,直到遇见第二个”。
六、修改命令行提示符
Shell 通过PS1和PS2这两个环境变量来控制提示符的格式,修改PS1和PS2的值就能修改命令提示符的格式。其中PS1 控制最外层的命令提示符格式,而PS2 控制第二层的命令提示符格式。
6.1 查看当前命令提示符格式
6.2 修改命令提示符格式(临时和永久)
通过这种方式修改的命令提示符只在当前的 Shell 会话期间有效,再次启动 Shell 后(切换root之后再切换回xjh时)将重新使用默认的命令提示符。
如果希望持久性地修改 PS1,让它对任何 Shell 会话都有效,那么就得把 PS1 变量的修改写入到 Shell 启动文件(即~/.bashrc 文件)中,即在该文件中添加下述代码,然后重新启动shell
七、编写shell脚本
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash就是指明了解释器的具体位置
补充:输出变量的内容在变量名前面加$
7.1 执行脚本程序(新进程)
7.1.1 第一种方式:将 Shell 脚本作为程序运行
7.1.2 第二种方式:将 Shell 脚本作为参数传递给 Bash 解释器
补充: Linux 中的每一个进程都有一个唯一的 ID,称为 PID,使用$$变量就可以获取当前进程的 PID
7.2 执行脚本程序(当前进程)
source 命令。source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限
source 命令的用法为:
source filename
也可以简写为:
. filename
两种写法的效果相同。对于第二种写法,注意点号.和文件名中间有一个空格
八、shell四种运行方式
shell 是一个应用程序,它的一端连接着 linux 内核,另一端连接着用户。Shell 是用户和 Linux 系统沟通的桥梁,我们都是通过 Shell 来管理 Linux 系统。
8.1 登录式与非登录式
- 通过直接使用 Shell,叫做非登录式
- 通过输入用户名和密码后再使用 Shell;叫做登录式
8.1.1 判断 Shell 是否为登录式
判断 Shell 是否为登录式也非常简单,只需执行shopt login_shell即可,值为on表示为登录式,off为非登录式
8.2 交互式与非交互式
- 通过在 Shell 中一个个地输入命令并及时查看它们的输出结果,整个过程都在跟 Shell 不停地互动,这叫做交互式。
- 通过运行一个 Shell 脚本文件,让所有命令批量化、一次性地执行,这叫做非交互式。
8.2.1 判断Shell是否是交互式
判断是否为交互式 Shell 有两种简单的方法
-
查看变量-的值,如果值中包含了字母i,则表示交互式(interactive)
在脚本中输出变量-的值表示为非交互式
-
查看变量PS1的值,如果非空,则为交互式,否则为非交互式,因为非交互式会清空该变量
通过以上四种的排列组合,一共有四种运行方式:
- 交互式的登录 Shell;
- 交互式的非登录 Shell;
- 非交互式的登录 Shell;
- 非交互式的非登录 Shell
补充:同时判断交互式与登录式
root@shixi ~ ]echo $PS1; shopt login_shell
root@shixi ~ ]echo $-; shopt login_shell
·