Shell 脚本和编程

课程介绍

这节课咱们学习shell根底和语法,shell履行过程和原理,shell调试和前端集成。

学习shell的价值:

  1. Linux服务器的根本操作和办理
  2. 前端Node.js服务的进程办理、问题排查、资源监控等运维操作
  3. 运用shell编写TCE、SCM、Docker脚本,完结服务编译和部署

课程准备

  • 一台装置了linux体系的物理机或者云主机,可运转shell脚本
  • 本地的vscode装置BashDebug插件,并晋级bash到4.x以上
  • Npm大局装置zx依靠

Shell根底概念

概念

  • Shell是操作体系最外的一层
  • 物理终端=>软件终端tty=>终端模拟器=>shell
  • Shell是Linux内核的一个外层维护东西,也是一个指令行解说器,担任将用户指令解析为操作体系所能理解的指令,实现用户与操作体系的交互。
    Shell 脚本和编程 | 青训营笔记

开展

3个阶段

  • KenThonpson(来自贝尔实验室)在1971年为UNIX开发了第个shell,称为V6shell
  • StephenBoume在贝尔实验室为VUNIX所开发的Bourneshell即sh
  • 开源安排GUN为了替代Boumeshell开发的Bourne-Again shell,即Bash

构成

  1. 指令行解说器
  2. 编程言语

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

语法和指令

变量

  • shell中的变量类型
  1. 自定义变量
  2. 环境变量
  3. 体系环境变量
类型 作用域
自定义变量 当时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大局指令的搜索途径

运算符和引证

类型: 管用运算符 逻辑运算符 比较运算符 引号 圆括号 指令连接 后台运转

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

管道

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结束,也能够没有。

发动方式三种:

  1. 文件名运转

    ./filename.sh

  2. 解说器运转

    bash ./filename.sh

  3. source运转
    source ./filename.sh

履行过程

  1. 字符解析
  2. shell 打开
  3. 重定向
  4. 履行指令
  5. 收集状况并回来

shell打开

  1. 大括号打开(Brase Expansion) {..}

一般由三部分构成:前缀,大括号,后缀 大括号打开是一种能够生成恣意字符串的机制。打开大括号的形式采用可选的前缀,后接一系列逗号分隔的字符串或一对大括号之间的序列表达式,后接可选的后缀。前缀与大括号中包含的每个字符串组合,然后将后缀附加到每个成果字符串,从左到右打开。

  1. 波涛号打开(Tilde Expansion) ~

假如一个单词以未加引号的斜杠字符(’~’)开头,则第一个未加引号的斜杠之前的一切字符(假如没有加引号的斜杠,则一切字符)都被视为波涛前缀。假如波涛号前缀中的字符都没有被引证,那么波涛号后面的波涛号前缀中的字符将被视为或许的登录名。假如这个登录名是空字符串,则用shell变量HOME的值替换波涛号。假如没有设置HOME,则替换履行shell的用户的HOME目录。否则,波涛前缀将被替换为与指定登录名相关的主目录。

  1. 参数打开
  • 直接参数扩展${!parameter}
  • 参数长度${#parameter}
  • 空参数处理:parameter:−word为空替换;{parameter:-word}为空替换;{parameter:=word}为空替换,并赋值给parameter变量;parameter变量;{parameter:?word}为空报错;${parameter:+word}不为空替换。
  • 参数切片
  • 参数部分删除
  1. 指令替换

指令替换允许指令的输出替换指令自身。

  • $(…)
  1. 数学计算(Arithmetic Expansion) $((..))

运用$(())包裹数学运算表达式,得到成果并替换。

  1. 文件名打开(Filename Expansion) ?[..]外壳文件名形式匹配 当单词没有被引号包裹,且出现’‘ ‘?’ ‘[‘字符,shell会按照正确的方式查找文件名替换,假如没找到坚持不变。

调试和前端集成

调试

  1. 普通log,运用echo,printf
  2. 运用set指令
  3. vscode debug插件

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

VSCode装备

插件

  1. shellman:代码提示和自动补全
  2. shellcheck:代码语法校验
  3. shell-format:代码格局化
  4. Bash Debug:支撑单步调试

前端集成

  1. node中经过exex ,spawn 调用shell指令
  2. shell脚本中调用node指令
  3. 凭借zx等库进行javascript,shell script的融合

总结

Shell编程是一种在Linux体系中常用的脚本言语,它能够经过编写一些简略的脚本来完结一些复杂的任务。这节课咱们从履行、装备加载、解析过程、语法的次序去回想知识脉络,去温习也是很便利的,有多的时间还能够去拓展,了解更多。