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

126 阅读4分钟

Shell基础概念、发展基础和构成

基础概念

  • tty/终端/终端模拟器:输入输出环境
  • Shell:解释器,编程语言。处理终端输入,解释执行后输出结果给终端
  • Bash:shell的一种具体实现

Shell 发展

Shell 语法与命令

基本语法可看:bash基本语法指南

变量

自定义变量

= 默认声明变量都是字符串型,支持整型,浮点型,日期型。作用于当前shell。

  • 等号两边不能有空格

  • 可将命令/命令结果复制给变量

  • 因为默认变量为字符串,在默认情况下不会进行+运算

  • 可以声明变量为其他型,例:

     declare -i xx #将变量声明为整型
    

image.png

环境变量

export declare -x 作用于当前shell及其子shell;

父子shell:当前shell(父进程)在执行第三方/核心工具时,启动子进程执行,子进程执行完后交还给父进程,父进程再执行下一条命令。

系统环境变量 启动加载,作用于所有shell

image (1).png 以上值是在需要启动的时候从环境变量配置文件中读取和初始化,可以用echo指令查看相关信息:

echo $HOME #当前用户的主目录
echo $USER #用户名
echo $PS1 #配置命令行提示符 
echo $PATH #从左到右查找命令的路径

如果需要修改以上默认值:

vim ~/.bashrc #跳转到bashrc文件,进行修改
source ~/.bashrc #修改后不会立刻生效,需要重启终端胡总和执行source命令

配置文件加载过程

image.png

  • login shell 例如ssh远程登录一台主机
  • non-login shell:登录之后使用的shell
    • 交互式:直接与用户交互
    • 非交互式:用户让shell执行另一个shell,此时另一个shell属于非交互式shell

运算符和引用

image.png

管道

管道与管道符|:将前一个命令的结果传递给后面的命令

语法:cmd1|cmd2 #右边的需要是标准输入,ls、mv可以用预处理命令xargs

管道命令中如果出现错误的话是不会报错的。如需修改在命令前加set -o pipefall 遇到错误就退出

重定向

重定向可以将shell中标准输入fd0,标准输出fd1,标准错误fd2原本分别指向终端输入,终端输出,终端输出 的形式修改成指向不同的输出

  • 输入重定向符号
    • <
    • <<
  • 输出重定向符号
    • >:覆盖写入文件
    • >>:追加写入文件
    • 2>:错误输出写入文件
    • &>:正确和错误输出同一写入到文件中

判断命令

test,[,[[:进行整数测试,字符串测试,文件测试

注意:

  • 中括号前后要有空格符
  • [和test是命令,只能用自己支持的标志位
  • 中括号里的变量最好用引号括起来
  • [[更丰富,在整型中支持< > =,在字符串中支持=~正则

分支语句

  • if

      if condition ; then
          程序段
      elif condition ; then
          程序段
      esle 
          程序段
      fi
    
  • case

      case $变量 in:
      "第一个变量内容") #分支1
      程序段
      ;;
      "第一个变量内容") #分支2
      程序段
      ;;
      *)
      程序段 #默认分支
      ;;
      esac
      
    

循环

  • while 循环

      while condition ; 
      do
      程序段; 
      done
    
  • until 循环(和while'循环相反,表示条件成立的时候跳出循环)

     until condition ;
     do
     程序段;
     done
     
    
  • for 循环

     #方式一
     for 变量 in a b c #将a b c三个值分别赋给变量,进行循环
     do
     程序段;
     done
     
     #方式二
     for ((i=0;i<100;i++))
     do
     程序段
     done
     
    

函数

  1. funcName(){程序段;}
  2. function funcName(){程序段;}

注意

  • 函数必须在使用前定义
  • 函数获取变量和shell script类似,0代表函数名,后续参数通过0代表函数名,后续参数通过1 $2获取
  • 函数内return仅表示函数执行状态,不表示函数执行结果
  • 返回结果一般使用echo,printf,在外使用$(),``获取结果
  • 如果没有return,函数状态是上一条命令执行状态,储存在$?中

模块化

在当前shell中执行另一个shell文件

    source [函数库的路径]
    

常用命令如图

image.png

执行过程和原理

如何写和启动

1.首先第一行需要指定用什么命令解释器执行,一般是以下两种任选:

#!/bin/bash
#! /usr/bin/env bash

2.启动方式:以下三种任选

./filename.sh #文件名运行,在子进程中执行
bash ./filename.sh #解释器运行,在子进程中执行
source ./filename.sh #source运行,在当前进程中执行

执行过程

  1. 字符解析
  2. shell 展开
  3. 重定向
  4. 执行命令
  5. 收集状态并返回

shell 展开

  • 大括号展开 {字符串序列或者表达式序列}
  • 波浪号展开 ~ #当前用户主目录的值
  • 参数展开 间接参数展开{} 间接参数展开{!} 参数长度${#} 空参数处理 参数切片 参数部分删除
  • 命令替换 $(...)or`...`
  • 数学计算 $((...))
  • 文件名展开:当单词没有被引号包裹而且出现了*、?。[字符,则shell会按照正则匹配方法查找文件名进行替换,如果没有找到则保持不变

调试和前端集成

调试

  1. echo,printf
  2. set命令
  3. vscode debug插件

前端继承

  1. node中通过exec,spawn调用shell命令

  2. shell中脚本调用node命令

  3. 借助zx等库进行融合