第三天:Shell脚本编程 | 青训营笔记

92 阅读1分钟

一、课程内容

1. shell语法和命令

(1) 变量

  • 自定义变量:仅当前shell[=]{let、delare -i}
  • 环境变量:当前shell以及其子shell[declare -x,export]

图片.png

  • 系统环境变量:所有shell[启动加载]{0(当前shell名称)0(当前shell名称)、#(传入参数数量)、/*/@(传入脚本的所有参数)、?(上条命令执行的状态码)?(上条命令执行的状态码)、HOME(主文件夹)、$PATH(全局命令的搜索路径)

配置文件加载

  • login shell :login shell --> /etc/profile --> one of

~/bash_profile | ~/bash_login | ~/.profile --> ~/bashrc --> finish

  • non-login shell :~/bashrc --> /etc/bashrc

运算符

引号

  • 单引号 ' ' :完全引用、原样输出
  • 双引号 " " :部分引用
  • 反引号 : 执行命令

圆括号

  • () :执行命令
  • (()) :算数运算

分号 ;:(cmd1;cmd2) cmd1,cmd2串行执行

管道和重定向

  • 管道语法:cmd1 | cmd2
  • 重定向:(输出重定向)cmd1 > filename[覆盖]; cmd1 >> filename[追加];(输入重定向) cmd1 < filename[覆盖];cmd 1 << filename[追加]

判断命令

用于整数测试、字符串测试、文件测试

  • test
  • []
  • [[]]

分支语句

  • if elif else fi
  • case $num in "num值1");;"num值2");;...);;esac[)表示兜底]

循环语句

  • while : [while condition; do ... done]
  • until : [until condition; do ... done]
  • for : [for var in [...]; do ... done]

函数

语法:

  • function name(){}
  • function name{}
  • name(){}

注意:

  • shell自上而下进行,函数必须在使用前定义
  • 函数获取参数方式:1...1...n
  • return 仅仅表示状态,不是函数执行结果
  • 返回结果用:echo、printf打印
  • $?:查询上一条函数的执行状态

模块化

语法: source [函数路径]

shell执行过程和原理

  1. 执行过程

    shell脚本 --> bash解释器{字符解析(行分割、命令分割、参数分割) --> shell展开 --> 重定向 --> 执行命令 --> 收集状态并返回}

  2. shell展开

  • 大括号展开 :前缀、{}、后缀[a{b,c}d => abd acd、{1..3} => 1 2 3]
  • 波浪号展开 :[~ => HOME、 /foo=>HOME、~/foo => HOME/foo]
  • 参数展开:间接参数展开[:间接参数展开[(!parameter)]、参数长度[#parameter]、空参数处理[parameter:word]、参数切片[parameter:offset]、参数部分删除[{parameter:-word}]、参数切片[parameter:offset]、参数部分删除[{parameter%word}]
  • 命令替换
  • 数学计算
  • 文件名展开[正则表达式]

调试和前端集成

1. 调试

  • 普通log,使用echo、printf

  • 使用set命令[-u -x -i -o]

  • vscode debug插件