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

94 阅读3分钟

一、学习shell的价值: Linux服务器的基本操作和管理 前端Node.js服务的进程管理、问题排查、资源监控等运维操作 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署 二、shell课前准备: 一台安装了Linux系统的物理机或者云主机,可运行shell脚本 本地的vscode安装Bash Debug插件,并升级bash到4.x 以上 Npm全局安装zx依赖 三、shell基础概念: image.png Shell是一个命令解释器,它接收应用程序的/用户命令,然后调用操作系统内核; Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强,还可以提供给用户接口,使用丰富的GNU工具集,第三方的或者内置的,比如cd、pwd、exec、test、netstat等

shell语法和命令 变量: 1、命名规则:由字母数字下划线组成,但首字母不能是数字,不能使用bash中的关键字,赋值号的周围不能有空格。

自变量定义 #!/bin/bash

这是脚本文件的shebang,它告诉系统脚本文件使用哪种解释器来执行。在这个例子中,使用的是bash解释器 #变量名=变量值(等号左右不能有空格),定义了两个变量page_size和page_num,并分别给它们赋值为1和2

page size=1

page_num=2

#将命令复制给变量,这样可以通过变量名来执行命令。

_ls=ls

#将命令结果赋值给变量,可以通过变量名来访问命令结果

file_list=$(ls -a)

#默认字符串,不会进行 + 运算。所以total的值为"page_size*page_num"字符串

total=page_size*page_num

#声明变量为整型(-i),后续的数值计算中,total会被当作整型来处理

let total=page_size*page_num

declare -i total=page_size*page_num

#导出环境变量,使得其在子进程中也可用

export total

declare -x total

系统环境变量 ~表示进入当前用户的主目录,比如用户名是www, 那么命令cd 表示进入/home/www目录,.bashrc隐藏文件夹,/.bashrc就是指用户目录下的.bashrc目录。是通配符,/etc/profile.d/.sh 表示 /etc/profile.d/ 目录下所有的脚本文件(以.sh结尾的文件)。

配如果取得 bash 需要完整的登录流程, 我们称之为 login shell, 比如 ssh 远程登录一台主机

不需要登录的bash 我们称为 non-login bash, 比如在原来的 bash 中执行 bash开启子进程、 执行一些外部命令

如果修改了配置文件,不会立即生效,要通过source ~/.bashrc执行此文本使其生效

无论是否是交互式,是否是登录式,Bash Shell 在启动时总要配置其运行环境,例如初始化环境变量、设置命令提示符、指定系统命令路径等。这个过程是通过加载一系列配置文件完成的,这些配置文件其实就是 Shell 脚本文件。

运算符和引用

双引号:部分引用,使用这种引用时,$、`(反引号)、(转义符) 这 3 个还是会解析成特殊的意义

单引号:完全引用,只原样输出

反引号:执行命令

cmd & 实现让命令在后台运行

使用方法一的时候,当我们关闭终端,命令就会停止运行。加上nohup可以在关闭终端后不停止命令

注意: 1、条件表达式要放在方括号之间,并且要有空格,例如: [a = = a==a==b] 是错误的,必须写成 [ a ==a==b ]。

2、乘号(*)前边必须加反斜杠()才能实现乘法运算;

3、if…then…fi 是条件语句,后续将会讲解。

4、在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 “*” 不需要转义符号"" 。

shell管道: 定义:将一个命令的输出作为另一个命令的输入******

语法:cmd1 | cmd2******

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

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

重定向 每个 shell 命令在执行时都会打开三个文件描述符, 文件描述符0、1、2, 分别对应 stdin、stdout、stderr, 这三个文件描述符默认默认指向 终端输入、终端输出,那么当命令需要获取输入的时候,它会去读取 fd0, 当要输出的时候它会像 fd1、fd2写入, 改变这些描述符指向的行为叫做重定向

:将命令的输出重定向到一个文件中,如果文件不存在则创建,如果文件已经存在则覆盖。

:将命令的输出重定向到一个文件中,如果文件不存在则创建,如果文件已经存在则在文件末尾追加。

2>:将命令的错误输出重定向到一个文件中,如果文件不存在则创建,如果文件已经存在则覆盖。

&>:将命令的输出和错误输出重定向到一个文件中,如果文件不存在则创建,如果文件已经存在则覆盖。

<:将一个文件的内容作为命令的输入,表示继续沿用当前的标准输入, 只是当识别到指定的标识符后停止, 将接收到的内容作为 stdin

<<:将一段字符串作为命令的输入。

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

· 整数测试

· 字符串测试

· 文件测试

语法:

· test condition

· [ condition ]

· [[ condition ]]

注意:

· 中括号前后要有空格符

· [ 和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串

· 中括号内的变量,最好都是用引号括起来

· [[更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则

根据程序是否正常执行(程序退出的状态)进行判断

exit:手动退出 shell 的命令

exit 10 返回 10 给 shell,返回值非 0 为不正常退出

$? 用于判读昂当前 shell 前一个进程是否正常退出(非 0 为不正常退出)

分支语句 当if和else位于一行时,必须在condition后面加上分号,否则会出现语法错误; if语句后面跟的是命令 ,会执行命令,判断命令的退出状态,如果命令的退出状态是0,就执行then语句;否则不执行then里面的语句。

循环 for循环:读取不同的变量值,用来逐个执行同一组命令 image.png 2.While循环:重复测试某个条件,只要条件成立则反复执行

3.until循环:重复测试某个条件,只要条件不成立则反复执行

函数 函数的基本格式:

注意 :**** · shell自上而下执行,函数必须在使用前定义

· 函数获取变量和shell script类似,0代表函数名,后续参数通过0代表函数名,后续参数通过0代表函数名,后续参数通过1、$2..获取

· 函数内return仅仅表示函数执行状态,不代表函数执行结果

· 返回结果一般使用echo、printf,在外面使用$()、``获取结果

· 如果没有return,函数状态是上一条命令的执行状态,存储在$?中

模块化: 模块化的原理是在当前shell内执行函数文件,方式是:

Source [函数库的路径]