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

96 阅读4分钟

课程知识:shell 脚本和编程

01 shell基础概念

v6 shell > sh > Bash shell是编程语言,也是命令行解释器

02 语法和命令

变量分为:自定义变量、环境变量、系统环境变量

自定义变量

  • 可以将命令复制变量,或者将命令的结果复制给变量

  • 申明变量为整型,用let/declare

  • 导出变量 -x环境、-a数组、-i整数型、-r只读、-+设定/取消....

系统环境变量

image.png 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的融合