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

67 阅读3分钟

学习Shell的价值

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

准备

  • 一台安装了Linux系统的物理机或者云主机,可运行shell脚本
  • 本地的vscode安装Bash Debug插件,并升级bash到4.x以上
  • Npm全局安装zx依赖

1.Shell基础概念

概念

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


发展

构成

语法和命令

类型作用域声明方式规范
自定义变量当前shell=字符串、整型、浮点型、日期型
环境变量当前shell及其子shellexport 、declare -x
系统环境变量所有shell启动加载

自定义变量只能在父进程中用到,环境变量和系统环境变量在父进程和子进程中都可以使用

自定义变量

#!/bin/bash

#变量名=环境名(等号左右不能空格)
page_size=1
page_num=2

#将命令复制给变量
_ls=ls

#将命令结果赋值给变量
file_list=$(ls -a)

#默认字符串,不糊进行 + 运算
total=page_size*page_num   错错错

#声明变量为整型
let total=page_size*page_num

declare -i total=page_size*page_num

#导出环境变量
export total

declare -x total

系统环境变量

配置文件加载

修改了某个配置文件时,想让他在当前配置文件运行执行source ~/。bashrc

运算符和引用

管道

重定向

判断命令

例子:

要用双引号包裹

分支语句

语法1:if condition ;then

程序段

elif condition ;then

程序段

else

程序段

fi

连续判断

语法2:

case $变量 in:

"第一个变量内容”)

程序段

;;

"第一个变量内容")

程序段

;;

*)

程序段

;;

esac

循环

  • while循环

while condition ; do 程序段; done

  • until循环

until condition ; do 程序段;done

  • for 循环

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

函数

语法一:funcName(){echo "abc";}

语法二:funcName(){echo "abc";}

注意:

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

模块化

常用命令

执行过程和原理

执行

  1. shell脚本一般以 . sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行

1.#! /bin/bash

1 #! /usr/bin/env bash

2.启动方式

# 文件名运行
./filename.sh

#解释器运行
bash ./filename.sh

#source 运行
source ./filename.sh

执行过程

shell展开

  1. 大括号展开 (Brace Expansion){...}
  2. 波浪号展开(Tilde Expansion)~
  3. 参数展开(Shell Parameter Expansion)
  4. 命令替换(Command Substitution)
  5. 数学计算(Arithmetic Expansion)$((..))
  6. 文件名展开(Filename Expansion) * ? [..] 外壳文件名模式匹配

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

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

波浪号展开(Tilde Expansion)~

参数展开(Shell Parameter Expansion)

  1. 间接参数扩展

  1. 参数长度

  1. 空参数处理

  1. 参数部分删除

命令替换(Command Substitution)

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

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

调试和前端集成

调试

  1. 普通log,使用echo、printf
  2. 使用set命令
  3. vscode debug插件

vscode配置

前端集成

exec和spawn的区别:

在 Node.js 中,exec() 和 spawn() 都是用于执行命令行命令的方法,但在使用方式和性能方面有所不同。

  1. exec() 方法:

exec() 方法是异步执行命令的最简单方法之一,它默认执行 shell 的命令,并在 callback 函数中返回缓冲区输出。exec() 允许执行任何 shell 命令,而不仅限于 Node.js 环境下支持的命令。exec() 方法一次性执行整个命令,但当执行大量数据时,它可能会导致应用程序的内存飙升,因为它无法流式读取输出数据。

  1. spawn() 方法:

spawn() 方法使用流的方式处理数据,与 exec() 方法不同,它可以同时执行多个命令,并且不会在内存使用方面出现问题。spawn() 方法也支持成批分段输出数据,避免了大量的缓冲区分配。spawn() 方法还允许进一步配置选项,例如设置输出格式、重定向输入和输出流等。

结论:总的来说,在对性能有要求的情况下,可以使用 spawn() 方法,而不是 exec() 方法。如果只需要执行简单的 shell 命令并且无需处理大量输出,可以选择 exec() 方法。