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

26 阅读2分钟

学习Shell的价值

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

Shell基础概念

概念
Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机的控制。

  • 终端:获取用户输入、展示运算结果的硬件设备
  • tty:teletypeWriter的简称、和终端等价,早期指电传印机,在Linux中是输入/输出环境
  • 终端模拟器:Mac Terminal,iTern2等,关联虚拟机tty的输入输出软件
  • Shell:command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端
  • Bash:Shell的一种具体实现

发展

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

02cb2488aa5905673c95aff855649f9.png

构成

040c6ccd4e92efcff965b4bde45fa57.png

语法和命令

变量

85fd47245b3ba374a4a6e0f744bceb9.png

自定义变量

#1/bin/bash
# 这是脚本文件的shebang,它告诉系统脚本文件使用哪种解释器来执行。在这个例子中,使用的是bash解释器

#变量名=变量值(等号左右不能有空格),定义了两个变量page_size和page_num,并分别给它们赋值为12
page_size=1
page_num=2

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

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

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



declare -x total

declare选项的含义

选项含义
-给变量设定类型属性
+取消变量的类型属性
-a将变量声明为数组类型
-i将变量声明为整数型
-x将变量声明为环境变量
-r将变量声明为只读变量
-p显示指定变量的被声明的类型

系统环境变量

565b3b0bb4987d3d412972637b9bd56.png

  1. $#表示当前脚本或函数的参数个数。在shell脚本中,可以通过$#来获取当前脚本或函数的参数个数,并根据参数个数执行相应的操作。
  2. $*表示当前脚本或函数的所有列表参数。在shell脚本中,可以通过$*来获取当前脚本或函数的所有参数,并根据参数列表执行相应的操作。
  3. $?- 表示上一个命令的退出状态码。在shell脚本中,可以通过$?来获取上一个命令的退出状态码,并根据状态码执行相应的操作。
  4. $PS1表示shell提示符的格式。在shell中,可以通过修改$PS1来自定义shell提示符的格式,以适应个人习惯或需求。
  5. $HOME表示当前用户的主目录。在shell脚本中,可以通过$HOME来获取当前用户的主目录,并根据主目录执行相应的操作。
  6. $PATH表示系统的可执行文件路径列表。在shell中,可以通过修改$PATH来添加或删除系统的可执行文件路径,以便更方便地执行系统命令或自定义命令。

配置文件加载

5ed8d2cdde7e2d395b5fe466e6541bb.png

运算符和引用

0d92e1227d622666be923bcf2371cbe.png

管道

管道与管道符|,作用是将前一个命令的结果传递给后面的命令 语法:cmd1 | cmd2 要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理 注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -0 pipefail设置shell遇到管道错误退出

#!/bin/bash

cat platform.sccess.log \ grep ERROR

netstat -an | grep ESTABLISHED | wc -l

find . -maxdepth l -name "*.sh" | xargs ls -l

重定向

ba4f413a2dcb67c3b0136ffbf578d0d.png

判断命令

shell中提供了test、[、[[三种判断符号,可用于:

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

语法

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

注意

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

分支语句

32bd4a99f175d2189f9d317eefac286.png

循环

  • while循环:
    while condition ; do 程序段;done
  • until循环:
    until condition;do 程序段;done
  • for循环:
    for var in[words...];do 程序段;done

函数

语法一:
funcName(){echo"abc";} 语法二:
function funcName(){echo"abc";}

注意

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

模块化

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

常用命令

2bc894d18043fb4c5cb5f5e61229a07.png

执行过程及原理

执行过程

05a866a6e30373d3773dcf201d01964.png

shell展开

  1. 大括号展开(Brace Expansion}{...}
  2. 波浪号展开(Tilde Expansion)~
  3. 参数展开(Shell Parameter Expansion)
  4. 命令替换(Command Substitution)
  5. 数学计算(Arithmetic Expansion) $((...))
  6. 文件名展开(Filename Expansion) * ? [..] 外壳文件名模式匹配

总结

0610c0aead4492fd52a09f130f7da68.png