Shell和Bash的关系可以理解为类和实例的关系
Shell的发展
Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell
Stephen Bourne在贝尔实验室为V7 UNIX所开发的Bourne shell,即sh
开源组织GNU为了取代Bourne shell开发的Bourne-Again shell,即Bash
变量
类型 作用域 声明方式 规范
自定义变量 当前shell = 字符串、整型、浮点型、日期型
环境变量 当前shell及其子shell export、declare -x
系统环境变量 所有shell 启动加载
自定义变量
系统环境变量
$USER表示查看用户名
上述变量的值是Shell启动时从环境变量配置文件中读取且初始化的,如果想要修改这些变量的默认值,也可以去配置文件中修改
配置文件加载
login shell为登录式shell,需要用户名密码;non-login shell为非登录式shell,平时打开的终端就属于non-login shell
管道
管道与管道符|,作用是将前一个命令的结果传递给后面的命令。语法:cmd1 | cmd2
【注意:管道右侧的命令必须能接受标准输入,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理;管道命令仅仅处理stdout,对于stderr会予以忽略,不会退出或报错,可以使用set -o pipefail设置shell遇到管道错误退出】
Xargs的原理就是将标准输入转化成参数列表的形式,然后交给之后的命令使用
重定向
输出重定向符号:
>:覆盖写入文件
>>:追加写入文件
2>:错误输出写入文件
&>:正确和错误输出统一写入到文件中
输入重定向符号:< <<
Wc -l <<EOF表示当检测到EOF时停止输入,并将已经输入的内容统计之后输出
判断命令 shell中提供了test、[、[[三种判断符号,可用于:整数测试、字符串测试、文件测试
如果要使用函数,参数跟在函数名后,按顺序排列,如:funcName 参数1 参数2
注意:
shell自上而下执行,函数必须在使用前定义
函数获取变量和shell script类似,$0代表函数名,后续参数通过$1、$2……获取
函数内return仅仅表示函数执行状态,不代表函数执行结果
返回结果一般使用echo、printf,在外面使用$()、“获取结果
如果没有return,函数状态是上一条命令的执行状态,存储在$?中
模块化
模块化的原理是在当前shell内执行函数文件,语法:source [函数库的路径]
执行
Shell脚本一般以.sh结尾,也可以没有,这是一个约定,第一行需要指定用什么命令解释器来执行。可以使用#! /bin/bash 也可以是#! /usr/bin/env bash
启动方式:一、文件名运行 ./filename.sh;二、解释器运行 bash ./filename.sh;三、source运行 source ./filename.sh
exec会启动一个子shell去执行前端的命令,并且将命令执行的结果存在缓冲区,执行完毕之后将缓冲区的结果返回到回调函数当中,缓冲区有大小限制,默认200KB,超过限制就会报错;spawn不会启动子shell进程,会返回流对象,直接对流对象进行写入和读取的操作,没有大小的限制,所以比较适合大数据量的操作