- Shell原理
在操作系统中,最底层是硬件,而硬件上面是内核(kemel),内核上面是库,库上面是应用程序,在众多的应用程序当中,有一个shell的应用程序,俗称外壳,用户是无法直接和内核交互的,那么就必须借助shell来实现系统的调用。图:
shell是工作在操作系统的最外层,而内核(kernel)则是工作在操作系统的最里层,由于内核听不懂人类语言,而我们也记不住内核语言,而两者的沟通就需要shell的支持了。
2、Bash:编程
程序控制结构,调用机器上命令程序文件进行程序编写;
外部命令:各应用程序提供;
程序:指令+数据
算法+数据结构
过程式编程:以指令为中心,设计算法,数据服务于算法;
对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;
bash过程式编程:
顺序执行:逐个执行
选择执行:只执行其中一个分支
循环执行:一段代码要执行0,1或多遍
编程元素:变量、流程、函数
变量:可变化的量,命名内存空间
bash环境:
本地变量:当前shell进程;
环境变量:当前shell进程及其子进程;
局部变量:某个函数执行过程;
位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;
特殊变量:$?, $*, [email protected], $#, $$
变量类型:
数值,字符;
数值:
整数
浮点数
字符:
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