课程知识:shell 脚本和编程
01 shell基础概念
v6 shell > sh > Bash shell是编程语言,也是命令行解释器
02 语法和命令
变量分为:自定义变量、环境变量、系统环境变量
自定义变量
-
可以将命令复制变量,或者将命令的结果复制给变量
-
申明变量为整型,用let/declare
-
导出变量 -x环境、-a数组、-i整数型、-r只读、-+设定/取消....
系统环境变量
shell种类登陆式(从etc/profile开始)和非登录式(~./bashrc)
运算符和引用
或:||
与:&&
串行执行,并且无关;
管道
cmd1|cmd2
管道右侧命令必须标准输入,管道命令仅处理stdout
重定向
输入、输出重定向
- 输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
- 输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
判断命令
- shell中提供了test、[、[[三种判断符号,用于整数测试(eg等于、lt小于、gt大于)、字符串测试(-z为空、 -n非空、$str_a是否相等)、文件测试(-e是否存在、-f 判断file是否存在并且是一个文件、 -d file 判断file是否存在并且是一个文件夹)
- test [是命令
- [ 前后要有空格,变量用引号括起来
- [[ 更丰富用法,整型和字符串比较都支持
分支语句
shell中分支语句主要是两种:一种是if语句,另一种是case语句
-
if后面的指令,首先会被执行,然后根据指令的返回状态码进入对应的分支。如果状态码为0,也就是指令执行成功,就进去then的部分;非0则进入其他分支。
-
if语句经常用在分支不是很多的场景下,当分支较多时可以考虑使用case语句。
-
if单分支
if 表达式; then 执行语句 fi -
if双分支
if 表达式; then 执行语句 else 执行语句 fi -
if多分支
if 表达式; then 执行语句 elif 表达式;then 执行语句 elif 表达式;then 执行语句 ………… else 执行语句 fi -
case
case "变量" in 值1) 指令1... ;; 值2) 指令2... ;; *) 指令3... esac
循环
-
for 循环
for 变量名 in 取值列表 do 命令序列 done -
while循环
while 条件测试操作 do 命令序列 done函数
将命令序列格式写在一起;可方便重复使用命令序列
shell函数定义
方法一:
[function] 函数名(){
命令序列
[return x] #使用return或exit可以显示的结束函数
}
方法二:
函数名(){
命令序列
}
注意点:shell自上而下,函数必须在使用前定义,返回结果用echo、printf,用local定义变量,避免污染
模块化
脚本调用脚本的方法有两种,第一种是bash调用,在子shell里执行子脚本;第二种是引用调用,在当前脚本里执行子脚本。
shell展开
Shell接收到用户输入的命令以后,会根据空格将用户的输入,拆分成一个个词元(token)。然后,Shell会展开词元里面的特殊字符,展开完成后才会调用相应的命令。这种特殊字符的展开,称为shell展开(expansion)。其中有些用到通配符,又称为通配符展开(wildcard expansion)。Bash一共提供七种展开。展开的顺序是:大括号展开、波浪展开、参数和变量展开、算数展开和子命令展开(以从左到右的方式完成),分词和文件名扩展。
03 调试与集成
调试
三种方法:(1)普通log,使用echo、printf (2)使用set命令(一般在开头) (3)vscode debug插件
集成
1、node中通过exec、spawn调用shell命令
2、shell脚本中调用node命令
3、借助zx等库进行javascript、shell script的融合