Shell脚本和编程 | 青训营笔记

67 阅读1分钟

Shell和Bash的关系可以理解为类和实例的关系

Shell的发展

Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell
Stephen Bourne在贝尔实验室为V7 UNIX所开发的Bourne shell,即sh
开源组织GNU为了取代Bourne shell开发的Bourne-Again shell,即Bash

Pasted Graphic 32.png

变量

类型                作用域                 声明方式                       规范

自定义变量         当前shell                   =                  字符串、整型、浮点型、日期型

环境变量       当前shell及其子shell    exportdeclare -x

系统环境变量       所有shell                启动加载

自定义变量 Pasted Graphic 37.png

Pasted Graphic 38.png

系统环境变量 Pasted Graphic 39.png $USER表示查看用户名

上述变量的值是Shell启动时从环境变量配置文件中读取且初始化的,如果想要修改这些变量的默认值,也可以去配置文件中修改

配置文件加载 Pasted Graphic 40.png 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仅仅表示函数执行状态,不代表函数执行结果
返回结果一般使用echoprintf,在外面使用$()、“获取结果
如果没有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进程,会返回流对象,直接对流对象进行写入和读取的操作,没有大小的限制,所以比较适合大数据量的操作