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

52 阅读3分钟

学习Shell的价值

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

image.png

RUN 关键词可以执行大部分的Shell命令

Step 1 Shell 基础概念

概念

image.png

终端 <=> tty

image.png

image.png

  • 终端模拟器是指软件模拟tty的输入输出环境来完成软件型终端。
  • Shell是终端的命令解释器,负责解释来自终端的Shell命令并且将输出的结果返回给终端。
  • Bash 是Shell的一种实现,相当于Shell 的实例

发展

image.png

  1. Ken Thompson 在 1971 年为UNIX开发了第一个shell,即V6 shell
  2. Stepjen Bourne 在贝尔实验室为 V7 UNIX 所开发的 Bourne Shell 即sh
  3. 开源组织GUN为了取代Bourne Shell 开发了Broune-Again shell,即Bash

构成

image.png

Shell构成

  • 解释器
    • bash内置命令
    • GUN 核心工具集
    • 第三方库
  • 编程语言
    • 变量
      • 自定义变量
      • 环境变量
      • 系统环境变量
    • 运算
      • 逻辑运算符
      • 算术运算符
    • 语句
      • 判断
      • 分支
      • 循环
    • 函数

Step 2 命令和语法

变量

image.png

image.png

父进程和子进程 父进程在执行的时候,被触子进程时,会先执行子进程,当子进程完成后,再执行父进程的下一条命令。 其中自定义变量只能在父进程中使用,子进程无法使用,但是环境变量和系统环境变量就可以在子父进程中任意使用

自定义变量

# 变量名=变量值 (等号左右不能有空格)
page_size=1
page_num=2

# 将命令复制给变量
_ls=ls

# 将命令结果复制给变量
file_list=$(ls -a)

#默认字符串,不会进行+运算
total=page_size*page_num

# 声明变量为整型
let total=page_size*page_num

declare -i total=page_size*page_num

# 导出环境变量
export total

declare -x total

image.png

declare 关键字用于声明变量的类型,类似于var

系统环境变量

image.png

image.png

修改bashrc文件: image.png

将PS1修改为\u@\h \w >>>
image.png

此时修改之后退出bashrc文件并未更新,输入source ~/.bashrc即可更新

image.png

image.png

shell:

  • 登陆式
    • 与非登陆式相比,会先进入/etc/profile文件夹,然后去加载~/bash_profile~/bash_login~/.profile
    • 在执行了上述流程后才会去执行~./bashrc等非登陆式流程文件
  • 非登陆式
    • 交互式
      • 在终端等待用户的输入,处理之后将结果反馈给用户
    • 非交互式
      • 会直接执行用户输入的脚本,并且输出结果,不会等待用户的指令

运算符和引用

image.png

注意:

  1. 双引号内只有$、`、\ 保留作用
  2. ((x + y)) 双括号表示算术运算
  3. cmd1||cmd2 在cmd1执行失败的时候,执行cmd2
  4. cmd1&&cmd2 在cmd1执行成功的时候,执行cmd2
  5. cmd1;cmd2 cmd1、cmd2串行并行
  6. & 让命令在后台运行,与nohup一起使用cmd &

管道

管道符|,作用是将前一个命令的结果传递给后一个命令 语法:cmd1 | cmd2 image.png

要求: 管道右侧的命令必须能接受输入标准才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理。

注意:管道命令仅仅处理stdout,对于stderr会忽略,可以使用set -o pipefall设置shell遇到管道错误退出。 image.png

重定向

image.png

判断命令

image.png

image.png

注意:

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

image.png

例如这里,我们使用$name == "hello" 的时候,变量在被解析后并未被双引号包裹导致报错

分支语句

image.png

if 判断

demo: image.png

case判断

demo:

image.png

循环

image.png

while - demo: image.png

until - demo:

image.png

for - demo:

image.png

函数

image.png demo:

image.png

注意:

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

demo:

image.png

模块化

模块化的原理是在当前shell内执行文件,方式:source [函数库的路径]

常用命令

image.png

总结:
没有学习过linux语法之前,对于各类shell语句会感到很困惑和陌生,但是只要平时多使用,其实常用命令就那么多,多敲几次就记下来了。