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

101 阅读2分钟

价值点:

  1. Linux服务器基本操作和管理
  2. 前端Node.js的运维操作
  3. 编写TCE、SCM、Docker脚本,完成服务编译和部署

概念

  • 终端:获取用户输入、展示运算结果的硬件设备
  • 终端模拟器:关联虚拟tty的输入输出软件
  • tty:teletypewriter的简称,和终端等价,在Linux中是输入输出环境
  • shell:命令解释器,处理来自终端模拟器的输入,解释执行后的输出结果给终端
  • bash:shell的一种具体体现

火狐截图_2023-04-21T07-57-49.861Z.png

变量

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

自定义变量

变量名=变量值(等号左右不能有空格) page_size=1

可以把命令如sh或者命令结果如$(ls -a)赋值给变量

默认是字符串类型

变量需要声明是什么类型

导出环境变量 export total 或者declare -x total

declare的一些选项

-是给变量设定类型属性
+是取消类型属性
-a 将变量声明为数组类型
-i 整数型
-x 环境变量
-r 将变量声明为只读变量
-p 显示指定变量的被声明类型

系统环境变量

图片.png

图片.png

配置文件加载

登录式:从/etc/profile这个文件开始,然后去加载~/bash_profile然后~/bash_login然后~/.profile接着,去执行~./bashrc和/etc/bashrc

非登录式(又分为交互式和非交互式):~./bashrc然后/etc/bashrc

当我们修改了某个配置文件,想要生效,需要执行一下source ~/.bashrc

图片.png

反引号``

即使后台运行,关闭shell的时候仍然会关闭,除非搭配nohup 使用

nohup node sever.js & 会一直在后台运行

管道

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

管道右侧命令必须能接受标准输入才行

比如grep ,不能使用:ls 、mv ,可以用xargs 预处理 再使用ls

管道命令仅处理标准输出,如果有错误也不会退出,使用set -o pipefail设置shell遇到管道错误退出

重定向

标准输入的文件描述符fd0指向终端输入

标准输出的文件描述符fd1指向终端输出

标准错误的文件描述符fd2指向终端输出

输出重定向符号

>覆盖写入文件
>>追加写入文件
2>将错误输出写入文件
&>全部写入文件

输入重定向符

 <
 <<   遇到某符号的时候停止
 

判断

test、[ ] 、[[ ]] ,其中中括号前后要有空格,否则会报错,中括号中的变量最好用引号括起来

用于整数(标志位等于-eq小于-lt大于-gt)、字符串(为空-z非空-n 相等=)、文件测试(文件是否存在-e文件是否存在,并且是一个普通文件-f)

分支语句

第一种

    if 条件;then
    程序段
    elif 条件;then
    程序段
    else 
    程序段
    fi

第二种

case $变量 in:
“第一个变量内容”)
程序段
;;
*)
程序段
;;
esac

循环

图片.png

函数

函数内的return 仅表示函数执行的状态,不代表函数执行结果

返回结果一般使用echo 或printf

在外面使用$() 和`` 获取结果

如果没有return,函数状态是上一条命令的执行状态,存储在$?里

在函数里使用local 定义变量可以防止污染外部,使用在内部

模块化

指的是在当前的shell中,执行其他的函数文件、方式 source 【函数库路径】

shell常用命令

5f4c9e633ea7a665b75941755010cfb.png

执行

shell脚本一般以.sh结尾或没有

命令解释器

#! /bin/bash 或者 #! /usr/bin/env bash

启动方式

  • 文件名运行

      ./filename.sh
    
  • 解释器运行

      bash ./filename.sh
    
  • source运行

           source ./filename.sh
           
    

执行过程

shell脚本会交给bash解释器去执行

1、字符解析

  • 识别换行符、分号--------------(行的分割)
  • 命令连接符如(|| && 管道)----------(命令的分割)
  • 空格、tab符----------(命令、参数的分割)

2、shell展开 比如,会将{1..3} 解析成 1 2 3

b74296be7a0fe4626a7aefb187105d7.png

f86910908fceceda129330c66e667a0.png

22af48c6a01cff2bec332c7041e1411.png

fe6635266ae63704c2bbfbf9fd84605.png

798b9f72620d20eddedd6229e987bb1.png

6d7b73b7f2ca4a5cd5231ca8c548c65.png

fb95c41573a4ac978e2c33e44bed8b3.png

3、进行重定向,将stdin、stdout、stdeer的文件描述符进行指向变更

4、执行命令,内置命令会直接执行,非内置命令会使用$PATH查找,启动子进程进行执行

5、收集状态并返回

调试

1、echo 或者printf

2、set命令

  • -u遇到不存在变量报错,停止执行 -x运行结果前,先输出所执行的那一行的命令

  •   -e一旦发生错误,终止执行
    
  •   -o pipefail 管道符连接,一有子命令失败,整个管道命令就失败,脚本就终止执行
    
  •   -o nounset
    
  •   -o xtrace
    
  •   -o errexit
    

3、vscode的配置(快捷编码)

  • shellman:代码提示和自动补全
  • shellcheck:代码语法校验
  • shell-format:代码格式化
  • Bash Debug:支持单步调试

前端集成

1、node中用exec(会启动子shell进程,有大小限制)、spawn 调用shell命令

2、shell脚本中用node命令

借助zx等库进行JavaScript、shell script的融合