Shell 脚本和编程
课程介绍
这节课咱们学习shell根底和语法,shell履行过程和原理,shell调试和前端集成。
学习shell的价值:
- Linux服务器的根本操作和办理
- 前端Node.js服务的进程办理、问题排查、资源监控等运维操作
- 运用shell编写TCE、SCM、Docker脚本,完结服务编译和部署
课程准备
- 一台装置了linux体系的物理机或者云主机,可运转shell脚本
- 本地的vscode装置BashDebug插件,并晋级bash到4.x以上
- Npm大局装置zx依靠
Shell根底概念
概念
- Shell是操作体系最外的一层
- 物理终端=>软件终端tty=>终端模拟器=>shell
- Shell是Linux内核的一个外层维护东西,也是一个指令行解说器,担任将用户指令解析为操作体系所能理解的指令,实现用户与操作体系的交互。
开展
3个阶段
- KenThonpson(来自贝尔实验室)在1971年为UNIX开发了第个shell,称为V6shell
- StephenBoume在贝尔实验室为VUNIX所开发的Bourneshell即sh
- 开源安排GUN为了替代Boumeshell开发的Bourne-Again shell,即Bash
构成
- 指令行解说器
- 编程言语
语法和指令
变量
- shell中的变量类型
- 自定义变量
- 环境变量
- 体系环境变量
类型 | 作用域 |
---|---|
自定义变量 | 当时shell |
环境变量 | 当时shell及其子shell |
体系变量 | 一切shell |
声明方式 | 规范 |
---|---|
= | 字符串、整型、浮点型、日期型 |
export、declare -x | |
发动加载 |
- 父子shell
当父进程在第三方或核心东西时会发动子进程去履行,履行完后交还给父进程,父进程再持续履行下一条指令
自定义变量
#变量名=变量值(等号左右不能有空格)
page_size=1
page_num=2
#将指令仿制给变量
_ls=ls
#将指令成果赋值给变量
file_list=$(ls-a)
#默许字符串,不会进行+运算
total=page_size*page_numX (过错)
#声明变量为整型
lettotal=page_size*page_num
declare-itotal=page_size*page_num
#导出环境变量
exporttotal
declare-xtotal
选项 | 意义 |
---|---|
– | 给变量设定类型特点 |
+ | 撤销变量的类型特点 |
-a | 将变量声明为数组类型 |
-i | 将变量声明为整数型 |
-x | 将变量声明为环境变量 |
-r | 将变量声明为只读变量 |
-p | 显现指定变量的被声明的类型 |
体系环境变量
- $0:表示当时履行的脚本或指令的称号
- $#:表示指令或脚本要处理的参数的个数
- $*:把一切的参数看成以空格分隔的一个字符串整体(单字符串)回来
- $?上条指令履行的状况码
- $PS1指令提示符
- $HOME用户主文件夹
- $PATH大局指令的搜索途径
运算符和引证
类型: 管用运算符 逻辑运算符 比较运算符 引号 圆括号 指令连接 后台运转
管道
Linux管道运用竖线|连接多个指令,这被称为管道符。Linux管道的具体语法格局如下: cmd1|cmd2
- 要求:管道右侧的指令必须能接受规范输入才行,比如grep指令,ls,mv等不能直接运用,能够运用xargs预处理
重定向
重定向能够让咱们的程序的规范输出、过错输出的信息重定向文件里,那么么这儿还能够将文件的内容替代键盘作为一种规范输入的方式,在C言语的函数为:dup。
输入重定向符号“<” ,“<<”
输出重定向符号“>”,“>>”,“2>”,“&>”
判别指令
shell中供给了test、 [ 、[[ 三种判别符号,可用于:
- 整数测验
- 字符串测验
- 文件测验
语法
- test condition
- [condition]
- [[condition]]
留意
- 中括号前后要有空格符;
- [和test是指令,只能运用自己支撑的标志位,<、>、=只能用来比较字符串
- 中括号内的变量,最好都是用引号括起来 -[[更丰厚,在整型比较中支撑<、>、=,在字符串比较中支撑=~正则
分支句子
shell中分支句子主要是两种:
-
if句子
if句子常常用在分支不是许多的场景下,if后面的指令,首先会被履行,然后根据指令的回来状况码进入对应的分支。假如状况码为0,也就 是指令履行成功,就进去then的部分;非0则进入其他分支。
语法:
ifcondition;then
程序段
elifcondition;then
程序段
else
程序段
fi
- case句子
当分支较多时能够考虑运用case句子
case $变量 in:
"第一个变量内容")
程序段
;;
"第一个变量内容")
程序段
;;
*)
程序段
;;
esac
循环
三种循环:
- while循环
只需条件成立,则重复循环,不成当即停止
while条件测验操作
do
指令序列
done
- until循环 重复测验某个条件,只需条件不成立则重复循环
until条件测验操作
do
指令序列
done
- for循环 for循环,又有人称之为条件循环,或者foriin,其实就是for循环的特性,次数和给与的条件是成正比的
for变量名in取值列表
do
指令序列
done
函数
将指令序列按格局写在一同,可便利重复运用指令序列 语法
- funcName(){echo “abc”}
- function funcName(){echo “abc”}
留意:
- shell自上而下履行,函数必须在运用前定义
- 函数获取变量和shellscript类似,0代表函数名,后续参数经过0代表函数名,后续参数经过1、$2…获取
- 函数内return只是表示函数履行状况,不代表函数履行成果
- 回来成果一般运用echo、printf,在外面运用$()、”获取成果
- 假如没有return,函数状况是上一条指令的履行状况,存储在$?中
函数回来值
return表示退出函数并回来一个退出值,脚本中能够用$?变量显现该值
运用原则:
函数一完毕就取回来值,因为$?变量只回来履行的最后一条指令的退出状况码
退出状况码必须是0~255,超出时值将为除以256取余
模块化
原理:在当时shell内履行函数文件
source [函数库的途径]
常用指令
指令 | 运用 |
---|---|
grep | 查找过错日志:grep-n”ERR0R”-A3-B3cloudfun.log 统计次数:grep-n”ERROR”-ccloudfun.log |
sort | 指定分隔符后以第三列进行排序: sort-t” “-k3 |
wc | 统计出现的行数、单词数、字符数wc-1wm |
head | 检查前10行 head-n10cloudfun.log |
tail | 等待追加内容:tail-f-n10cloudfun.log |
cut | 对数据行的内容进行处理cut-d ” ” -f3 |
find | 文件和目录查找 |
xargs | 参数处理 |
which | 查找指令途径 |
履行过程和原理
履行
shell脚本一般以.sh结束,也能够没有。
发动方式三种:
-
文件名运转
./filename.sh
-
解说器运转
bash ./filename.sh
-
source运转
source ./filename.sh
履行过程
- 字符解析
- shell 打开
- 重定向
- 履行指令
- 收集状况并回来
shell打开
- 大括号打开(Brase Expansion) {..}
一般由三部分构成:前缀,大括号,后缀 大括号打开是一种能够生成恣意字符串的机制。打开大括号的形式采用可选的前缀,后接一系列逗号分隔的字符串或一对大括号之间的序列表达式,后接可选的后缀。前缀与大括号中包含的每个字符串组合,然后将后缀附加到每个成果字符串,从左到右打开。
- 波涛号打开(Tilde Expansion) ~
假如一个单词以未加引号的斜杠字符(’~’)开头,则第一个未加引号的斜杠之前的一切字符(假如没有加引号的斜杠,则一切字符)都被视为波涛前缀。假如波涛号前缀中的字符都没有被引证,那么波涛号后面的波涛号前缀中的字符将被视为或许的登录名。假如这个登录名是空字符串,则用shell变量HOME的值替换波涛号。假如没有设置HOME,则替换履行shell的用户的HOME目录。否则,波涛前缀将被替换为与指定登录名相关的主目录。
- 参数打开
- 直接参数扩展${!parameter}
- 参数长度${#parameter}
- 空参数处理:parameter:−word为空替换;{parameter:-word}为空替换;{parameter:=word}为空替换,并赋值给parameter变量;parameter变量;{parameter:?word}为空报错;${parameter:+word}不为空替换。
- 参数切片
- 参数部分删除
- 指令替换
指令替换允许指令的输出替换指令自身。
- $(…)
- …
- 数学计算(Arithmetic Expansion) $((..))
运用$(())包裹数学运算表达式,得到成果并替换。
- 文件名打开(Filename Expansion) ?[..]外壳文件名形式匹配 当单词没有被引号包裹,且出现’‘ ‘?’ ‘[‘字符,shell会按照正确的方式查找文件名替换,假如没找到坚持不变。
调试和前端集成
调试
- 普通log,运用echo,printf
- 运用set指令
- vscode debug插件
VSCode装备
插件
- shellman:代码提示和自动补全
- shellcheck:代码语法校验
- shell-format:代码格局化
- Bash Debug:支撑单步调试
前端集成
- node中经过exex ,spawn 调用shell指令
- shell脚本中调用node指令
- 凭借zx等库进行javascript,shell script的融合
总结
Shell编程是一种在Linux体系中常用的脚本言语,它能够经过编写一些简略的脚本来完结一些复杂的任务。这节课咱们从履行、装备加载、解析过程、语法的次序去回想知识脉络,去温习也是很便利的,有多的时间还能够去拓展,了解更多。