Shell 基础概念学习笔记

113 阅读3分钟

Shell 脚本和编程

学习 shell 的价值:

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

课程准备

• 一台安装了 linux 系统的物理机或者云主机,可运行 shell 脚本

• 本地的 vscode 安装 Bash Debug 插件, 并升级 bash 到 4.x 以上

• Npm 全局安装 zx 依赖

Shell 基础概念

概念

终端

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

终端模拟器

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

tty

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

Shell

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

Bash

  • shell的一种具体实现

发展

  1. Ken Thompson(来自贝尔实验室)在 1971 年为 UNIX开发了第一个 shell,称为 V6 shell

  2. Stephen Bourne 在贝尔实验室 为 V7 UNIX 所开发的 Bourne shell , 即 sh

  3. 开源组织 GNU 为了取代 Bourne shell 开发的Bourne-Again shell, 即 Bash

构成

主要由编程语言和解释器组成

  • 解释器
  • bash内置命令
  • GNU核心工具集
  • 第三方库
  • 编程语言

-变量

  • 运算
  • 语句
  • 函数 image.png

语法和命令

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

image.png

自定义变量

image.png

image.png

系统环境变量

image.png

运算符的引用

image.png

管道

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

语法: cmd1 | cmd2

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

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

重定向

输出重定向符号

>:覆盖写入文件

>>:追加写入文件

2>:错误输出写入文件

&>:正确和错误输出统一写入到文件中

输入重定向符号

<

<<

image.png


常用命令

命令使用
grep查找错误日志:grep -n "ERROR" -A3 -B3 cloudfun.log
统计次数: grep -n "ERROR" -c cloudfun.log
sort指定分隔符后以第三列进行排序: sort -t " " -k 3
wc统计出现的行数、单词数、字符数 wc -lwm
head查看前十行: head -n 10 cloudfun.log
tail等待追加内容: tail -f -n 10 cloudfun.log
cut对数据行的内容进行处理 cut -d " " -f 3
find文件和目录查找
xargs参数处理
which查找命令路径

调试和前端集成

调试

1. 普通log, 使用 echoprintf

2. 使用 set 命令

3. vscode debug插件

VSCode 配置

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

2. shellcheck: 代码语法校验

3. shell-format: 代码格式化

4. Bash Debug: 支持单步调试
    - 安装 vscode 插件
    - 编写 launch.json文件
    - 升级 bash 到 4.x 以上版本
           

前端集成

1. node中通过 exec、spawn 调用 shell 命令

2. shell 脚本中调用 node 命令

3. 借助 zx 等库进行 javascript、 shell script 的融合
    - 借助 shell 完成系统操作, 文件io、内存、磁盘系统状态查询等
    - 借助 nodejs 完成应用层能力, 网络io、计算等

本章小结

image.png