1. Shell原理

    在操作系统中,最底层是硬件,而硬件上面是内核(kemel),内核上面是库,库上面是应用程序,在众多的应用程序当中,有一个shell的应用程序,俗称外壳,用户是无法直接和内核交互的,那么就必须借助shell来实现系统的调用。图:

shell是工作在操作系统的最外层,而内核(kernel)则是工作在操作系统的最里层,由于内核听不懂人类语言,而我们也记不住内核语言,而两者的沟通就需要shell的支持了。

2、Bash:编程

程序控制结构,调用机器上命令程序文件进行程序编写;

外部命令:各应用程序提供;

程序:指令+数据

算法+数据结构

过程式编程:以指令为中心,设计算法,数据服务于算法;

对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;

bash过程式编程:

顺序执行:逐个执行

选择执行:只执行其中一个分支

循环执行:一段代码要执行0,1或多遍

编程元素:变量、流程、函数

变量:可变化的量,命名内存空间

bash环境:

本地变量:当前shell进程;

环境变量:当前shell进程及其子进程;

局部变量:某个函数执行过程;

位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;

特殊变量:$?, $*, $@, $#, $$

变量类型:

数值,字符;

数值:

整数

浮点数

字符:

ASCII

120:

字符:1, 2, 0

数值:120 -->

变量类型的作用:

存储空间

运算

存储格式

语言对变量类型的支持力度:

强类型:

弱类型:变量类型不严格区分;

默认存储机制:bash为字符

bash的变量使用特点:弱类型、无须事先声明;

本地变量:

name=value

name: 变量名

=:赋值符号

value:值

变量名:只能包含数字、字母和下划线;且不能以数字开头;

引用变量:${name}, $name

引用:

弱引用: "", 其内部的变量引用会被替换为变量值;

强引用:'',其变量的变量引用会保持原有字符;

命令引用:`COMMAND`, $(COMMAND),引用命令的执行结果;

声明为整型:

declare -i name[=value]

let name=value

查看所有变量:set

生命周期:

创建

销毁:

自动销毁:shell进程终止;

手动销毁:unset name

环境变量:

被"导出"的本地变量

export name[=value]

declare -x name[=value]

查看所有环境变量:env, printenv, export

销毁:

unset name

脚本:文本文件

运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后由bash进程负责解析并运行此逻辑;

启动脚本:

(1) # bash /PATH/TO/SCRIPT_FILE

(2) 一个执行权限,

# ./PATH/TO/SCRIPT_FILE

shebang:

#!/bin/bash

第一行:顶格给出shebang

注释行:#

bash的常用选项:

-n: 检查脚本中的语法错误;

-x:调试执行脚本;

命令状态结果:

bash进程用于追踪执行的命令成功与否的状态:

0: 成功

1-255:失败

特殊变量:

$?:上一条命令的执行状态结果;

布尔型:

"真":成功

"假":失败

自定义脚本的状态结果:

exit [n]

注意:脚本中任何位置执行了exit命令即会终止当前shell进程;

条件测试:

界定程序执行环境;

(1) 根据运行的命令的状态结果;

(2) 测试表达式

test EXPRESSION

[ EXPRESSION ]

` EXPRESSION `

整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;

$A -gt $B:是否大于;是则为"真",否则为"假";

$A -ge $B: 是否大于等于;

$A -lt $B:是否小于;

$A -le $B: 是否小于等于;

$A -eq $B: 是否等于;

$A -ne $B:是否不等于;

字符串测试:ASCII数值越大,字符比较时其值越大;

"$A" > "$B":是否大于;

"$A" < "$B":是否小于;

"$A" == "$B":是否等于;

"$A" != "$B":是否不等于;

-z "$A":是否为空;空则为"真",否则为"假"

-n "$A":是否不空;不空则"真",空则为"假"

注意:应该使用` EXPRESSION `

文件测试:测试文件的存在性以及属性;

-e $file: 是否存在;存在则为"真",否则为"假";

-a $file: 同上;

-f $file:文件是否存在且为普通文件;

-d $file:文件是否存在且为目录;

-h $file:是否存在且为符号链接文件;

-L $file: 同上

-b $file:是否存在且为块设备文件;

-c $file:是否存在且为字符设备文件;

-S $file:是否存在且为套接字文件;

-p $file: 是否存在且为管道文件;

-r $file: 当前用户对文件是否拥有读权限;

-w $file:当前用户对文件是否拥有写权限;

-x $file:当前用户对文件是否拥有执行权限;

-u $file:文件是否拥有SUID权限;

-g $file:文件是否拥有SGID权限;

-k $file