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

113 阅读2分钟

本节课讲述一下内容:

Shell基础概念

命令和语法

执行过程和原理

调试和前端集成

一.shell构成:

shell是一个解释器,也是一个编程语言,

image.png

二.shell语法和命令:

类型1:自定义变量的作用域为当前shall,声明方式为等号“=”,默认声明的变量为字符串型,shell也支持整型,浮点型和日期型。

类型2:作为环境变量,作用域为当前shell以及子shell,声明方式为export,declare和-x.

类型3:作为系统环境变量,作用域为所有shell,声明方式为启动加载。

当前shell指的是父进程,当父进程触发了第三方或者核心工具时,会启动一个子进程执行,执行完毕之后交还给父进程,然后父进程继续执行下一条命令。自定义变量只能在父进程中用到,而环境变量和系统环境变量在父进程和子进程中都可以用到。

image.png

自定义变量:

变量名=变量值的形式,等号两边不能有空格,否则shell会当作额外的命令

#!bin/bash

#变量名=变量值
page_size=1
page_num=2

#将命令复制给变量
_ls = ls

#将命令结果赋值给变量
file_list = $(ls -a)

#默认字符串,不会进行 + 运算
total = page_size * page_num  (X)

#需要先声明变量为整型
let total = page_size * page_num
或者:
declare -i total = page_size * page_num

#导出环境变量
export total

declare -x total

image.png

系统环境变量:

image.png

常用变量名:用来配置变量提示符的PS1变量,用来查找用户主目录的PS1变量,用来查找用户主目录的HOME变量

shell分为登录式与非登录式,登录式shell即用户输入用户名和密码登录的shell,而非登录式shell是在用户登录之后打开的一个终端shell。非登录式分为交互式与非交互式。 交互式即用户看到的shell,它会在终端等待用户的输入,然后处理之后将结果反馈出来,和用户有一个直接的交互。如果使用sh执行一个test的脚本,此时打开的shell去执行test的时候为非交互式的,没有等待用户的输入,而是直接去执行脚本。

image.png

其中登录式是从login shell开始执行,而非登录式直接从non-login shell开始即可。如果想使刚修改的文件生效,执行source ~/.bashrc.

运算符和引用:

image.png

管道: 作用是将前一个命令的输出当作后一个命令的输入

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

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

#! /bin/bash

cat paltform.access.log | grep ERROR

netstat -an | grep ESTABLEHED |wc -l

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

重定向:

shell当中的命令在执行的时候会有三个文件描述符fd0(标准输入),fd1(标准输出),fd2(错误输出),默认三个描述符会指向终端输入,终端输出和终端输出。重定向可以用来修改默认的引用关系,比如将他们中的某一个指向某一个文件。

在此,重定向分为输入重定向和输出重定向。输入重定向符号为 "<"和"<<"(继续引用当前的标准输入,当识别到指令符号的时候就会停止接收,并将以及接收到的结果传递给命令),输出重定向分为">"(覆盖写入文件),">>"(追加写入文件),"2>"(错误输出写入文件),"&>"(正确和错误输出统一写入到文件中)

判断命令

shell中可以使用test,[],[[]],三种判断符号,可用于整数测试,字符串测试和文件测试。

注意:

中括号前后要有空格符;

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

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

更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则

分支语句: case和if.

循环语句: while循环,until循环,for循环

函数:

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

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

注意:

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

函数获取变量和 shell script类似,0代表函数名,后续参数通过?>0代表函数名,后续参数通过?>1、$2...获取函数内return仅仅表示函数执行状态,不代表函数执行结果

返回结果一般使用echo. printf,在外面使用()、“获取结果如果没有return,函数状态是上一条命令的执行状态,存储在()、“获取结果如果没有return ,函数状态是上一条命令的执行状态,存储在?中

三.shell的执行和原理:

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

#!/bin/bash #! /user/bin/env bash

启动方式:

文件名运行(会在子进程中执行脚本) ./filename.sh

#解释器运行(同上) bash ./filename.sh

#source 运行(会在当前的进程中执行脚本) source ./filrename.sh

执行过程:

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

  1. shell展开,例如{1..3}解析为123

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

4.执行命令 . builtin直接执行 ·非builtin使用SPATH查找,然后启动子进程执行

5.收集状态返回脚本

四.前端集成

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

shell脚本中调用node命令

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