Shell
shell —— 壳,保护内核
Shell 作用
- 完成用户和内核之间的信息交换 —— 翻译工具,命令解释器
Shell 即命令解释器
- Shell 是系统提供给用户的操作界面,提供了用户与内核进行交互操作的一种接口,它解释由用户输入的命令并且把它们送到内核执行任务
- 不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 Shell 命令组成的程序
- Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支、控制结构等,用这种编程语言编写的 Shell 程序与其它应用程序具有同样的效果
注:不同系统有不同的命令解释器,同一个系统命令解释器也有不同版本
补充说明
- Shell 有自己的语法结构,Shell 解释的命令实际就是一些符合 Shell 编程语言的程序
程序和进程的区别
- 程序是一段可以实现某一功能的代码,进程是这段代码运行的过程
- 程序是静态的文件状态、进程是这段程序运行的过程 —— 由命令解释器运行程序,将程序变成进程
编程语言 —— shell 是一种面向底层操作系统的编程语言
- Shell 语言、C、PHP、Python、Java、、、—— 有计算能力、流程控制
注:html 是一种语法,严格意义来说不具备编程语言的特征,主要是网页的样式设计
系统的包含关系 —— 硬件 --》内核 --》shell 解析器 --》应用程序
- 内核建立在硬件的 CPU 以及内存的基础上运行,CPU 由运算器和控制器组成 —— 冯诺依曼
- 内核在运行过程中,所执行的任务由命令或应用程序来控制,而命令的转换过程由 shell 完成 —— 解释命令
学习 Shell 脚本的目的
- 减少用户手动执行命令而产生的错误
- 减少重复性工作,让脚本来替管理员来完成重复性工作,提高效率 —— 编写脚本自动工作
简化重复操作,降低出错概率,是服务器管理的一大助力 —— 脚本
Shell 类型
查看当前系统兼容的 shell 类型 —— /etc/shells
- cat /etc/shells —— 查看当前系统兼容的,能识别的解释器类型
- /bin/sh --》/usr/bin/sh
- /bin/bash --》/usr/bin/bash
- /bin/tcsh、/bin/csh
注:/etc/shells 是系统所识别 shell 类型的配置文件,可以在其中添加或删除 shell 类型
说明
- /bin/sh 是 /bin/bash 的前身:为了兼容之前的版本,所以 sh 的 shell 类型依然存在
- /usr/bin/ 和 /bin/ 是同一个目录 —— 软链接
- /bin/tcsh 和 /bin/csh:操作系统一般使用 C 语言开发,Linux 内核是 C 语言写的,所以对 C 支持
注:软链接后加上 “/” 后 “ls -l” 命令会显示软链接的对应原文件的信息,删掉结尾的 “/” 或者直接在软链接所在目录使用 “ls -l” 即可查看它是软链接
注:目录是不允许由用户创建硬链接的,但实际上 Linux 支持目录创建硬链接,每个目录自带的 “.” 和 “…” 就是硬链接,代表当前目录和上级目录 —— Linux 操作系统的一个保护机制
用户登录 shell 类型
- /bin/bash
- /sbin/nologin —— 特殊的解释器,是配置文件中可以后续增加的解释器选项
说明
- /etc/shells 是 Linux 可以支持识别哪些命令解释器的配置文件,可以进行编辑
- 在 /etc/shells 中添加 /sbin/nologin 后,系统就可以识别、调用 /sbin/nologin,完成一些工作和任务
Shell 类型的分类
Shell 类型 | 易学性 | 可以执行 | 编辑性 | 快捷性 |
---|---|---|---|---|
Bourne shell(sh) | 容易 | 好 | 较差 | 较差 |
Bourne Again shell(bash) | 难 | 较好 | 好 | 好 |
C shell(csh) | 较难 | 差 | 较好 | 较好 |
TC shell(tcsh) | 难 | 差 | 好 | 好 |
Bash Shell 说明
- Linux 中 shell 有多种类型,其中最常用的几种是 Bourne shell 系列和 C shell 系列
- Bourne shell 是 UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用
- Bourne shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做的不如其它几种 shell
- Linux 操作系统默认的 shell 是 Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash
- 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加、增强了很多特性
- Bash 放在 /bin/bash 中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能
- 它还包含了很多 C shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面
bash shell 提供的功能 —— 提供了哪些便捷功能
- history,历史命令记录,这是 bash shell 解释器提供的命令记录功能,历史命令保存在指定配置文件中
- alias,别名,命令别名,实现将某些命令简化或把命令和选项进行结合、转义等功能
- tab,命令和目录的自动补全功能、、、
两种 Shell 脚本执行方式
- 添加执行权限:chmod +x *.sh —— 被动模式
- 给予可以执行权限,执行时再找到解释器执行
- 编写脚本的开头需要声明解释器类型:#!/bin/bash
- 使用解释器加载脚本:bash *.sh —— 主动执行
- bash 就是命令,使用命令将脚本中的代码加载到解释器中执行
注:使用 bash 可以主动加载没有 x 权限的脚本 —— 测试
Shell 脚本
Shell 中使用的工具 —— echo 命令
Shell 脚本的本质
- 可以将由人手动管理服务的过程变成程序自动执行
- 比如每次新装的操作系统都要重复进行的操作:yum 源配置、ip 地址设置、、、
- 将平时执行的命令罗列到脚本中,辅以一些自动化功能
echo 命令
- 格式:echo [选项] [输出内容]
- -e —— 支持反斜线控制的字符转换(转义字符)
- -n —— 取消输出后行尾的换行符号
例:编辑 vim hello.sh --》#!/bin/bash、echo “hello world” --》然后执行 bash hello.sh
#!/bin/bash
echo "hello world" # bash hello.sh --》hello world
echo -e 选项支持的特殊符号
- \a —— 输出警告音(声音的输出)
- \b —— 退格
- \c —— 取消输出行末的换行符,和 “-n” 选项功能一致
- \e —— ESCAPE 键
- \f —— 换页符
- \n —— 换行
- \r —— 回车键
- \t —— 制表符,tab
- \v —— 垂直制表符
- \0nnn —— 按照八进制 ASCII 码表输出字符。其中 0 为数字零,nnn 是三位八进制数
- \xhh —— 按照十六进制 ASCII 码表输出字符。其中 hh 是两位十六进制数
注:0 开头的数字表示八进制数,chmod 00755 file —— 第一个 0 表示八进制,第二个 0 表示取消特殊权限
例:将字符 “abcdef” 六个字符以两行三列输出,中间用制表符
echo -e "a\tb\tc\nd\te\tf # 两行三列,制表输出
a b c
d e f
注:“\n” 和 \t 表示转义字符,代表换行和 tab,注意一定要加 -e 选项才支持识别 “\” 的字符转义功能
补充:
- \\ —— 输出 “\” 字符 —— “\” 作为特殊符号的功能是强制换行
如:find 命令最后的选项 -exec {} ; —— “\” 作用是取消命令的别名
如:rm 命令存在 “rm -i” 的别名,\rm —— “\” 会注释掉 rm 的别名,使用命令本身的含义执行
echo 显示颜色
- 格式:“\e[m” 代表颜色输入开始,“\e[m” 代表颜色输入结束
- 文字颜色:
- 30 = 黑色、31 = 红色、32 = 绿色、33 = 黄色、34 = 蓝色、35 = 紫色、36 = 天蓝、37 = 白色、39 = 结束
- 底纹颜色:
- 40 = 黑色、41 = 红色、42 = 绿色、43 = 黄色、44 = 蓝色、45 = 紫色、46 = 天蓝、47 = 白色、49 = 结束
echo 特殊的显示
- \e[0m —— 关闭所有属性
- \e[1m —— 设置高亮度
- \e[4m —— 下划线
- \e[5m —— 闪烁
- \e[7m —— 反显
- \e[8m —— 消隐
例1:输出字符 “hello world” 并设置输出字符颜色为红色
echo -e "\e[31mhello world\e[0m" #\e[0m 表示结束所有的颜色或格式输出
例2:输出字符 “hello world” ,设置字符高亮显示,且颜色为红
echo -e "\e[31;1mhello world\e[0m" #特殊的显示,结合显示颜色
注:多个条件之间用分号 “;” 分割,可以同时生效
创建一个合格的 shell 脚本
[root@localhost ~]# vim hello.sh
#!/bin/bash
#This is my first piece of code
#Author(Email):liuchuan_jy@163.com
echo "We will print hello world of 7 colors."
echo -e "\e[30;1mhello world\e[0m"
echo -e "\e[31;1mhello world\e[0m"
echo -e "\e[32;1mhello world\e[0m"
echo -e "\e[33;1mhello world\e[0m"
echo -e "\e[34;1mhello world\e[0m"
echo -e "\e[35;1mhello world\e[0m"
echo -e "\e[36;1mhello world\e[0m"
注:vim hello.sh —— .sh 是命名规范,可写可不写,但 vim 会以后缀名识别脚本格式,显示字符串高亮
执行 shell 脚本 —— 两种方式
-
添加 x 执行权限(相对或绝对路径执行)
[root@localhost ~]# chmod +x hello.sh [root@localhost ~]# ./hello.sh
-
用 bash 命令,调用脚本文件
[root@localhost ~]# bash hello.sh
说明:执行一个脚本只有以上两种方式,主动通过 bash 命令执行,或者添加权限通过脚本声明的 shell 执行
补充:. hello.sh 或 source hello.sh 会将脚本加载到当前 shell 执行 —— 可加载配置文件