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

84 阅读2分钟

一、Shell基础概念

1.概念

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

2.发展

image.png

3.构成

image.png

二、命令和语法

1.变量

image.png

2.自定义变量

image.png

3.系统环境变量

image.png

4.配置文件加载

image.png

5.运算符和引用

image.png

6.管道

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

  • 语法:cmd1|cmd2
  • 要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,Is、mv等不能直接使用,可以使用xargs预处理
  • 注意:管道命令仅仅处理stdout,对于stderr会予忽略,可以使用set-o pipefail设置shell遇到管道错误退出
#!/bin/bash
cat platform.access.log|grep ERROR
netsta -an|grep ESTABLISHED|wc -1
find . -maxdepth 1 -name "*.sh"|xargs ls -1

7.重定向

image.png 输出重定向符号

  • '>':覆盖写入文件
  • '>>':追加写入文件
  • '2>':错误输出写入文件
  • '&>':正确和错误输出统写入到文件中
    输入重定向符号
    '<'
    '<<'

8.判读命令

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

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

语法:

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

注意: 中括号前后要有空格符;

  • [和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
  • 中括号内的变量,最好都是用引号括起来
  • [[更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则

9.分支语句

语法1:
if condition; then
程序段 
elif condition; then 
程序段 
esle 
程序段 
fi 

语法2:

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

10.循环

while循环
while condition;do 程序段;done
until循环
until condition; do 程序段; done
for循环
for var in [words...];do 程序段; done

11.函数

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

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

注意:

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

12.模块化

模块化的原理是在当前shell 内执行函数文件,方式:
source[函数库的路径]

13.常用命令

image.png

三、执行过程和原理

1.执行

  • shell脚本一般以.sh 结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行  
#!/bin/bash  
#!/usr/bin/env bash
  • **启动方式 **
#文件名运行  
./filename.sh  


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

# source 运行  
source ./filename.sh  

2.执行过程

字符解析

  • 识别换行符、分号(;)做行的分割
  • 识别命令连接符(1&& 管道)做命令的分割
  • 识别空格、tab符,做命令和参数的分割

shell展开, 例如(1..3)解析为1 2 3 
重定向, 将stdin、stdout、stderr的文件描述符进行指向变更
执行命令

  • builtin直接执行
  • 非builtin使用SPATH查找,然后启动子进程执行
    收集状态并返回

3.shell展开

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

四、调试和前端集成

1.调试

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

2.VSCode配置

  • 1.shellman:代码提示和自动补全
  • 2.shellcheck:代码语法校验
  • 3.shell-format:代码格式化
  • 4.Bash Debug:支持单步调试
    • 安装 vscode插件
    • 编写launch.json文件
    • 升级 bash到4.x以上版本

3.前端集成

  • node中通过exec、spawn调用 shell 命令
  • shell 脚本中调用 node 命令
  • 借助zx 等库进行 javascript、shell script 的融合
    • 借助 shell 完成系统操作,文件io、内存、磁盘系统状态查
    • 借助 nodejs 完成应用层能力, 网络io、计算等