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

84 阅读3分钟

学习shell的价值

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

shell基础概念

  1. 终端:获取用户输入、展示运算结果的硬件设备
  2. tty:teletypeWrier的简称,和终端等价,早期指电传印机,在linux中是输入/输出 环境
  3. 终端模拟器:Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件
  4. Shell:command interpreter,处理来自终端模拟器的输入,解释执行后输出结果给终端
  5. Bash:shell的一种具体实现

发展

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

Stephen Bourne 在贝尔实验室为V7UNIX所开发的Bourne shell,即sh

开源组织GNU为了取代Bourne shell开发的Bourne-Again shell开发的Bourne-Again shell,即Bash 屏幕截图 2023-04-19 211526.png 除了替代v6 shell,sh还有几个优点,把控制流程,循环,变量引入了脚本,提供了一种的更具功能性的语言

主流Linux系统使用的shell,许多都以它为锚点。

bash是sh的超集,可以直接执行大部分sh脚本。

Bash在兼容Bourne shell脚本编程的同时,集成了Korn shell和shell的功能,包括命令历史,命令行编辑,目录堆栈(pushd和popd),一些实用环境变量,命令自动补全等。

shell构成

屏幕截图 2023-04-19 212655.png shell不仅提供了与内核和设备交互的方法,还集成了一些今天软件开发中通用的设计模式(比如管道和过滤器),具备控制流程,循环,变量,命令查找的机制 即是命令解释器,也是一门编程语言,作为命令解释器,他提供给用户接口,实用丰富的GNU工具集,第三方的或者内置的,比如cd、pwd、exec、test、netstat等等

命令和语法

变量

屏幕截图 2023-04-20 205516.png

屏幕截图 2023-04-20 205524.png

自定义变量

屏幕截图 2023-04-20 205632.png

屏幕截图 2023-04-20 205647.png

系统环境变量

屏幕截图 2023-04-20 205703.png

配置文件加载

屏幕截图 2023-04-20 210519.png

运算符和引用

屏幕截图 2023-04-20 210536.png

管道

管道与管道符,作用是将前一个命令的结果传递给后面的命令\color{skyblue}{管道与管道符|,作用是将前一个命令的结果传递给后面的命令} 语法:cmd1|cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,使用xargs预处理
注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail设置shell遇到管道错误退出

#!/bin/bash

cat platform.access.log | grep ERROR

netstat -an | grep ESTABLISHED | wc-1

find .-maxdepth 1 -name "*.sh" | xargs ls -1

输出重定向符号\color{skyblue}{输出重定向符号}

重定向

屏幕截图 2023-04-20 210603.png

屏幕截图 2023-04-20 210618.png 在这里插入图片描述

判断命令

shell中提供了test[[[三种判断符号,[[[三种判断符号,可用于:\color{skyblue}{shell中提供了test、[、[ [三种判断符号,[、[[三种判断符号,可用于:}

  • 整数测试
  • 字符串测试
  • 文件测试 语法:\color{skyblue}{语法:}
  • test condition
  • [ condition ]
  • [[ condition ]] 注意:\color{skyblue}{注意:}
  • 中括号前后要有空格符
  • [ 和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
  • 中括号内的变量,最好都是用引号括起来
  • [[ 更丰富,在整形中支持<、>、=,在字符串比较中支持=~正则
#!/bin/bash
#整数测试
test $n1 -eq $n2
test $n1 -lt $n2
test $n1 -gt $n2
#字符串测试
test $n1 -z $str_a
test $n1 -n $str_a
test $n1 -$str_a = $str_b
#文件测试
test -e /dmt && echo "exist"
test -f /usr/bin/npm && echo "file exist"
#!/bin/bash
name="hello world"
[ $name == "hello" ]
script.sh:line5:[:too many argruments
Exited with error status 2

执行过程和原理

执行

1shell脚本一般以、sh结尾,也可以没有,这是一个约定:第一行需要指定用什么命令解释器来执行\color{skyblue}{1、shell脚本一般以、sh结尾,也可以没有,这是一个约定:第一行需要指定用什么命令解释器来执行}

#!/bin/bash
#!/usr/bin/env bash
#文件名运行
./filename.sh
#解释器运行
bash ./filename.sh
#source运行
source ./filename.sh

执行过程

1.字符解析\color{skyblue}{1.字符解析}

  • 识别换行符,分号做行的分割
  • 识别命令连接符(|| && 管道)做命令的分割
  • 识别空格、tab符,做命令和参数的分割 2.shell展开,例如1..3解析为123\color{skyblue}{2.shell展开,例如{1..3}解析为1 2 3} 3.重定向,将stdinstudentstderr的文件描述符进行指定变更\color{skyblue}{3.重定向,将stdin、student、stderr的文件描述符进行指定变更} 4.执行命令\color{skyblue}{4.执行命令}
  • builtin直接执行
  • 非builtin使用PATH查找,然后启动子进程执行PATH 查找,然后启动子进程执行 \color{skyblue}{5.收集状态并返回}$ 在这里插入图片描述

调试和前端集成

调试

1.普通log,使用echoprintf\color{skyblue}{1.普通log,使用echo、printf} 2.使用set命令\color{skyblue}{2.使用set命令} 3.vscodedebug插件\color{skyblue}{3.vscode debug}插件

在这里插入图片描述

#! /bin/sh
set -uxe -o pipefail
echo "hello world"
#! /bin/sh
a=1
b=(1 2 3 4 5)
echo $a
echo ${d[3]}
echo ${d[@]}
#输出
#1
#4
#1 2 3 4 5

VSCode配置

1.shellman:代码提示和自动补全\color{skyblue}{1.shellman:代码提示和自动补全} 2.shellcheck:代码语法校验\color{skyblue}{2.shellcheck:代码语法校验} 3.shellformat:代码格式化\color{skyblue}{3.shell-format:代码格式化} 4.BsahDebug:支持单步调试\color{skyblue}{4.Bsah Debug:支持单步调试}

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

前端集成

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

  • 借助shell完成系统操作,文件io、内存、磁盘系统状态查询等
  • 借助nodejs完成应用层能力,网络io、计算等