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

105 阅读3分钟

这是我参与「字节前端初阶青训营」伴学笔记创作活动的第3天。

课堂笔记

一、Shell基础概念

1、概念

  • 终端

获取用户输入、展示运算结果的硬件设备

  • tty

teletypewriter的简称. 和终端等价早期指电传印机.在linux中是输入/输出环境

  • 终端模拟器

Mac Terminal、 iTerm2等.关联虚拟tty的输入输出软件

  • Shell

command interpreter.处理来自终端模拟器的输入.解释执行之后输出结果给终端

  • Bash

shell的一种具体实现

image.png

2、发展

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

image.png

3、构成

image.png

二、命令和语法

1、变量

image.png

2、系统环境变量

image.png

3、自定义变量

image.png

4、配置文件加载

image.png

5、运算符和引用

image.png

6、管道

管道与管道符|,作用是将前一个命令的结果传递给后面的命令

语法: cmd1 | cmd2

要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理

注意:管道命令仅仅处理 stdout,对于stderr 会予以忽略,可以使用set -o pipefail设置 shell 遇到管道错误退出

image.png

7、重定向

image.png

8、判断命令

image.png

9、分支语句

image.png

10、循环

  • while循环

while condition ; do程序段;done

  • until循环

until condition ; do程序段; done

  • for循环

for var in [words . . .]; do程序段; done

image.png

11、函数

语法一:

funcName0f echo "abc "; }

语法二:

function funcName0 { echo "abc"; }

注意:

  • shell自上而下执行,函数必须在使用前定义
  • 函数获取变量和 shell script类似,0代表函数名,后续参数通过0代表函数名,后续参数通过1、$2 ...获取。
  • 函数内return仅仅表示函数执行状态,不代表函数执行结果
  • 返回结果一般使用echo、printf,在外面使用$() 、‘ ’获取结果
  • 如果没有return ,函数状态是上一条命令的执行状态,存储在$?中

image.png

12、模块化

模块化的原理是在当前she17 内执行函数文件,方式:

source[函数库的路径] image.png

13、常用命令

image.png

三、执行过程和原理

1、执行

image.png

2、执行过程

image.png

3、shell展开

  • 大括号展开(Brace Expansion) {...}

    一般由三部分构成,前缀、一对大括号、后缀,大括号内可以是逗号分割的字符串序列,也可以是序列表达式fx.y[..incr]

    image.png

  • 波浪号展开(Tilde Expansion) ~

image.png

  • 参数展开(Shell Parameter Expansion)01.间接参数扩展0 1.间接参数扩展{!parameter},其中引用的参数并不是parameter而是parameter的实际的值

    2.参数长度$ {#parameter}

    3.空参数处理 fparameter :-word} #为空替换 'parameter:=word} # 为空替换,并将值赋给parameter变量parameter变量 fparameter : ?word} #为空报错 $ fparameter : +word} #不为空替换

    4.参数切片 parameter:offset{parameter:offset} iparameter:offset:length}

    5.参数部分删除 {parameter%word}#最小限度从后面截取word {parameter9%word}#最大限度从后面截取word {parameter#word}#最小限度从前面截取word {parameterllword}#最大限度从前面截取word

    image.png

  • 命令替换(Command Substitution)

    在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有两种: $(...)或`...

    image.png

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

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

    image.png

  • 文件名展开(Filename Expansion) * ?[..]外壳文件名模式匹配

    当有单词没有被引号包裹,且其中出现了‘*’, ‘?’, and‘[’字符,则shell会去按照正则匹配的方式查找文件名进行替换,如果没找到则保持不变。

image.png

四、调试和前端集成

1、调试

  • 普通log,,使用echo、printf
  • 使用set命令
  • vscode debug插件

image.png

2、VsCode配置

1.she11man:代码提示和自动补全

2.she1lcheck:代码语法校验

3.she11一format:代码格式化

4.Bash Debug:支持单步调试

-安装vscode插件 –编写launch. json文件 -升级 bash到4.x以上版本

image.png

3、前端集成

  1. node中通过exec、spawn调用shell命令
  2. shell脚本中调用node命令
  3. 借助zx等库进行javascript、shell script的融合

-借助shell完成系统操作,文件io、内存、磁盘系统状态查

-借助nodejs 完成应用层能力,网络io、计算等

image.png