本节课讲述一下内容:
Shell基础概念
命令和语法
执行过程和原理
调试和前端集成
一.shell构成:
shell是一个解释器,也是一个编程语言,
二.shell语法和命令:
类型1:自定义变量的作用域为当前shall,声明方式为等号“=”,默认声明的变量为字符串型,shell也支持整型,浮点型和日期型。
类型2:作为环境变量,作用域为当前shell以及子shell,声明方式为export,declare和-x.
类型3:作为系统环境变量,作用域为所有shell,声明方式为启动加载。
当前shell指的是父进程,当父进程触发了第三方或者核心工具时,会启动一个子进程执行,执行完毕之后交还给父进程,然后父进程继续执行下一条命令。自定义变量只能在父进程中用到,而环境变量和系统环境变量在父进程和子进程中都可以用到。
自定义变量:
变量名=变量值的形式,等号两边不能有空格,否则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
系统环境变量:
常用变量名:用来配置变量提示符的HOME变量
shell分为登录式与非登录式,登录式shell即用户输入用户名和密码登录的shell,而非登录式shell是在用户登录之后打开的一个终端shell。非登录式分为交互式与非交互式。 交互式即用户看到的shell,它会在终端等待用户的输入,然后处理之后将结果反馈出来,和用户有一个直接的交互。如果使用sh执行一个test的脚本,此时打开的shell去执行test的时候为非交互式的,没有等待用户的输入,而是直接去执行脚本。
其中登录式是从login shell开始执行,而非登录式直接从non-login shell开始即可。如果想使刚修改的文件生效,执行source ~/.bashrc.
运算符和引用:
管道: 作用是将前一个命令的输出当作后一个命令的输入
管道符|,语法: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类似,1、$2...获取函数内return仅仅表示函数执行状态,不代表函数执行结果
返回结果一般使用echo. printf,在外面使用?中
三.shell的执行和原理:
执行:shell脚本一般以.sh结尾也可以没有,这是一个约定;第一行需要指定命令解释器来执行。
#!/bin/bash #! /user/bin/env bash
启动方式:
文件名运行(会在子进程中执行脚本) ./filename.sh
#解释器运行(同上) bash ./filename.sh
#source 运行(会在当前的进程中执行脚本) source ./filrename.sh
执行过程:
1.字符解析 识别换行符、分号(;)做行的分割 识别命令连接符(ll &&管道)做命令的分割识别空格、tab符,做命令和参数的分割
- 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、计算等