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

153 阅读3分钟

基础概念

  • 终端:获取用户输入、展示运算结果的硬件设备
  • tty:和终端等价,早期指电传印机,在linux中是输入/输出环境
  • 终端模拟器:关联虚拟tty的输入输出软件
  • shell:处理来自终端模拟器的输入,解释执行之后输出结果给终端
  • bash:shell的一种具体实现

语法和命令

变量

  • 自定义变量:作用域为当前shell,声明方式:“=”。规范:字符串、整型、浮点型、日期型

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

可以将命令赋值给变量

也可以将命令结果赋值给变量

默认字符串不会进行+运算

let 关键字声明变量为整型

  • 环境变量:作用域:当前shell及其子shell,声明方式:export、declare -x
  • 系统环境变量:作用域:所有shell,声明方式:启动加载

image.png

运算符和引用

image.png

管道

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

语法:cmd1 | cmd2

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

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

重定向

输出重定向:

  • '>' :覆盖写入文件
  • '>>' :追加写入文件
  • '2>':错误输出写入文件
  • '&>':正确和错误输出统一写入到文件中

输入重定向:

  • <
  • <<

判断命令

shell中提供了test、[、[[三种判断符号,可用于:

  • 整数测试
  • 字符串测试
  • 文件测试

语法:

  • test condition
  • [ condition ]
  • [[ condition ]]

注:

  • 中括号前后要有空格

  • [ 和test是命令,只能使用自己支持的标志位,<,>,=只能用来比较字符串

  • 中括号内的变量,最好都是用引号括起来

  • [[ 更丰富,在整型比较中支持<,>,=,在脂肪醇比较中支持=~正则 注:

  • shell自上而下执行,函数必须在使用前定义

  • 函数获取变量和shell script类似,0代表函数名,后续参数通过$$1、2…..获取

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

  • 返回结果一般使用echo、printf,在外面使用$()、''获取结果

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

  • 在函数内定义变量一般加local关键字,表示在当前作用域内生效

模块化

在当前shell内执行函数文件

方式:

  • source [路径]

执行过程和原理

执行

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

!/解释器路径 /bin/bash或/usr/bin/env bash

  • 启动方式

1.文件名运行 ./文件名 2.解释器运行 bash 文件路径 3.source运行 source 文件路径

前两种在子进程执行脚本后两种在当前进程执行脚本

执行过程

  • 字符解析
  • shell展开
  • 重定向
  • 执行命令
  • 收集状态并返回

调试和前段集成

调试

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

vscode配置

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

集成

  • node中通过exec、spawn调用shell命令
  • shell脚本中调用node命令
  • 借助zx等库进行js、shell script融合