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

192 阅读4分钟

一、学习Shell的价值

  • Linux服务器的基本操作和管理 I
  • 前端Node js服务的进程管理、问题排查、资源监控等运维操作
  • 使用shell 编写TCE、SCM、Docker脚本,完成服务编译和部署

二、shell基础概念

1、概念

image.png

  • 物理终端=> 软件终端tty=>终端模拟器=> shell
  • tty或者说终端最开始指的是获取用户输入并输出的物理设备,比如电传打字机
  • 在linux 中是接收用户输入、输出结果的终端仿真软件,比如我们用的mac terminal、iterm2等,更强输入辅助功能、画面绘制输出的模拟终端器,而 tty变成一个虚拟概念,是linux的一个程序,每个终端模拟器关联一个虚拟tty,和内核打交道。我们可以在终端模拟器中输入tty查看关联到的虑拟 tty bash是shell的一种具体实现,可以理解成实例和类的关系

2、发展

image.png

  • 除了替代v6 shell,sh 还有几个优点,把控制流程,循环,变量引入了脚本,提供了一种更具功能性的语言。主流Linux 系统使用的shell,许多都以它为锚点。
  • bash是sh的超集,可以直接执行大部分sh脚本。
  • Bash 再兼容 Bourme shell 脚本编程的同时,集成了 Korn shell 和C shell 的功能,包括命令历史,命令行编组,目录堆栈(pusd和 popd),一些实用环境变量,命令自动补全等。

3、构成

image.png

  • shell 不仅提供了与内核和设备交互的方法,还集成了一些今天软件开发中通用的设计模式(比如管道和过滤器),具备控制流程,循环,变量,命令查找的机制。既是命令解释器,也是一门编程语言,作为命令解释器,它提供给用户接口,使用丰富的GNU工具集,第三方的或者内置的,比如cd、pwd、exec,testnetstat 等等

三、语法和命令

1、变量

image.png

2、自定义变量

image.png

  • #!/bin/bash

  • 变量名=变量值(等号左右不能有空格)

    page_size=1

    page_num=2

  • 将命令复制给变量

    _ls=ls

  • 将命令结果赋值给变量 取消变量的类型属性

    file_list=$(1s -a)

  • 默认字符串,不会进行 +运算

    total=page size*page num ×

  • 声明变量为整型

    let total=page size page num

    declare -i total=page size*page_num √

  • 导出环境变量

    export total -P

    declare -x total

3、系统环境变量

image.png

  • 如何定义变量,写法、导出环境变量、变量作用域、父子shell的关系
  • Bash Shell在启动时总要配置其运行环境,例如初始化环境变量、设置命令提示符、指定系统命令路径等。

4、配置文件加载

image.png

  • 通过系统用户登录默认运行的shell
  • 非登录交互式运行shell
  • 执行脚本运行非交互式shell
  • 如果取得bash需要完整的登录流程,我们称之为login shell,比如ssh远程登录一台主机
  • 不需要登录的bash 我们称为non-login bash,比如在原来的bash中执行bash开启子进程、执行一些外部命令
  • 如果修改了配置文件,不会立即生效,需要我们重启终端或者执行 source 命令

5、运算符和引用

image.png

  • 双引号:部分引用,使用这种引用时,$、`(反引号)、(转义符)这3个还是会解析成特殊的意义
  • 单引号:完全引用,只原样输出
  • 反引号:执行命令
  • cmd&实现让命至在后台运行
  • 使用方法一的时候,当我们关闭终端,命令就会停止运行。加上nohup可以在关闭终端后不停止命令

6、管道

  • 管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令
  • 语法:cmd1|cmd2
  • 要求:管道右侧的命令必须能接受标准输入才行,比如 grep 命令,ls、mv等不能直接使用,可以使用xargs预处理
  • 注意:管道命令仅仅处理 stdout,对于stderr会予以忽略,可以使用set-opipefail 设置shell 遇到管道错误退出
  • 如果需要互通,比如第一个命令的返回传递给第二个命令,就需要用到管道了,管道的本质就是将多个程序进行了一个连接,和信号一样,也是进程通信的方式之一

7、重定向

image.png

  • 每个shell命令在执行时都会打开三个文件描述符,文件描述符0、1、2,分别对应stdin,stdout,stderr,这三个文件描述符默认默认指向终端输入,终端输出,那么当命令需要获取的入的时候,它会去读取fdo,当要输出的时候它会像fd1、fd2写入,改变这些描述符指向的行为叫做重定向
  • 2>&1必须写在 > 之后
  • <<比较特殊,表示继续沿用当前的标准输入,只是当识别到指定的标识符后停止,将接收到的内容作为 stdin
  • 实例:用户在命令行输入内容,当输入EOF 的时候停止,所输入的内容写入 foo.bxt

8、判定命令

shelll 中提供了 test、I、Ⅱ三种判断符号,可用于

  • 整数测试
  • 字符串测试
  • 文件测试

语法:

  • test condition
  • [condition]
  • [[condition]]

注意:

  • 中话号前后要有空格符
  • [ 和test 是命今,只能使用自己支持的标志位。< > =只能用来比较字符串
  • 中括号内的变量,最好都是用引号括起来
  • [[更丰富,在整体比较中支持< > =,在字符串比较中支持= ~正则
  • 根据程序是否正常执行(程序退出的状态)进行判断
  • exit:手动退出 shell 的命令
  • exit 10 返回10 给shell,返回值非0 为不正常退出
  • $? 用于判读昂当前 shell 前一个进程是否正常退出(非 0为不正常退出)

9、分支语句

image.png

10、循环语句

  • while循环

    while condition ;
    do 程序段;
    done

  • until循环(当条件成立的时候跳出循环)

    until condition ;
    do 程序段;
    done

  • for循环

    for var in [words...];
    do 程序段;
    done