一、学习Shell的价值
- Linux服务器的基本操作和管理 I
- 前端Node js服务的进程管理、问题排查、资源监控等运维操作
- 使用shell 编写TCE、SCM、Docker脚本,完成服务编译和部署
二、shell基础概念
1、概念
- 物理终端=> 软件终端tty=>终端模拟器=> shell
- tty或者说终端最开始指的是获取用户输入并输出的物理设备,比如电传打字机
- 在linux 中是接收用户输入、输出结果的终端仿真软件,比如我们用的mac terminal、iterm2等,更强输入辅助功能、画面绘制输出的模拟终端器,而 tty变成一个虚拟概念,是linux的一个程序,每个终端模拟器关联一个虚拟tty,和内核打交道。我们可以在终端模拟器中输入tty查看关联到的虑拟 tty bash是shell的一种具体实现,可以理解成实例和类的关系
2、发展
- 除了替代v6 shell,sh 还有几个优点,把控制流程,循环,变量引入了脚本,提供了一种更具功能性的语言。主流Linux 系统使用的shell,许多都以它为锚点。
- bash是sh的超集,可以直接执行大部分sh脚本。
- Bash 再兼容 Bourme shell 脚本编程的同时,集成了 Korn shell 和C shell 的功能,包括命令历史,命令行编组,目录堆栈(pusd和 popd),一些实用环境变量,命令自动补全等。
3、构成
- shell 不仅提供了与内核和设备交互的方法,还集成了一些今天软件开发中通用的设计模式(比如管道和过滤器),具备控制流程,循环,变量,命令查找的机制。既是命令解释器,也是一门编程语言,作为命令解释器,它提供给用户接口,使用丰富的GNU工具集,第三方的或者内置的,比如cd、pwd、exec,testnetstat 等等
三、语法和命令
1、变量
2、自定义变量
-
#!/bin/bash
-
变量名=变量值(等号左右不能有空格)
page_size=1
page_num=2
-
将命令复制给变量
_ls=ls
-
将命令结果赋值给变量 取消变量的类型属性
file_list=$(1s -a)
-
默认字符串,不会进行 +运算
total=page size*page num ×
-
声明变量为整型
let total=page size page num
declare -i total=page size*page_num √
-
导出环境变量
export total -P
declare -x total
3、系统环境变量
- 如何定义变量,写法、导出环境变量、变量作用域、父子shell的关系
- Bash Shell在启动时总要配置其运行环境,例如初始化环境变量、设置命令提示符、指定系统命令路径等。
4、配置文件加载
- 通过系统用户登录默认运行的shell
- 非登录交互式运行shell
- 执行脚本运行非交互式shell
- 如果取得bash需要完整的登录流程,我们称之为login shell,比如ssh远程登录一台主机
- 不需要登录的bash 我们称为non-login bash,比如在原来的bash中执行bash开启子进程、执行一些外部命令
- 如果修改了配置文件,不会立即生效,需要我们重启终端或者执行 source 命令
5、运算符和引用
- 双引号:部分引用,使用这种引用时,$、`(反引号)、(转义符)这3个还是会解析成特殊的意义
- 单引号:完全引用,只原样输出
- 反引号:执行命令
- cmd&实现让命至在后台运行
- 使用方法一的时候,当我们关闭终端,命令就会停止运行。加上nohup可以在关闭终端后不停止命令
6、管道
- 管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令
- 语法:cmd1|cmd2
- 要求:管道右侧的命令必须能接受标准输入才行,比如 grep 命令,ls、mv等不能直接使用,可以使用xargs预处理
- 注意:管道命令仅仅处理 stdout,对于stderr会予以忽略,可以使用set-opipefail 设置shell 遇到管道错误退出
- 如果需要互通,比如第一个命令的返回传递给第二个命令,就需要用到管道了,管道的本质就是将多个程序进行了一个连接,和信号一样,也是进程通信的方式之一
7、重定向
- 每个shell命令在执行时都会打开三个文件描述符,文件描述符0、1、2,分别对应stdin,stdout,stderr,这三个文件描述符默认默认指向终端输入,终端输出,那么当命令需要获取的入的时候,它会去读取fdo,当要输出的时候它会像fd1、fd2写入,改变这些描述符指向的行为叫做重定向
- 2>&1必须写在 > 之后
- <<比较特殊,表示继续沿用当前的标准输入,只是当识别到指定的标识符后停止,将接收到的内容作为 stdin
- 实例:用户在命令行输入内容,当输入EOF 的时候停止,所输入的内容写入 foo.bxt
8、判定命令
shelll 中提供了 test、I、Ⅱ三种判断符号,可用于
- 整数测试
- 字符串测试
- 文件测试
语法:
- test condition
- [condition]
- [[condition]]
注意:
- 中话号前后要有空格符
- [ 和test 是命今,只能使用自己支持的标志位。< > =只能用来比较字符串
- 中括号内的变量,最好都是用引号括起来
- [[更丰富,在整体比较中支持< > =,在字符串比较中支持= ~正则
- 根据程序是否正常执行(程序退出的状态)进行判断
- exit:手动退出 shell 的命令
- exit 10 返回10 给shell,返回值非0 为不正常退出
- $? 用于判读昂当前 shell 前一个进程是否正常退出(非 0为不正常退出)
9、分支语句
10、循环语句
-
while循环
while condition ;
do 程序段;
done -
until循环(当条件成立的时候跳出循环)
until condition ;
do 程序段;
done -
for循环
for var in [words...];
do 程序段;
done