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

125 阅读2分钟

Sell脚本和编程

01课程介绍

1学习shell的价值

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

目录

01 Shell基础概念 
02 命令和语法 
03 执行过程和原理 
04 调试和前端集成 

01Shell基础概念

1.Shell概念

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

2.发展

image.png

3.构成

image.png

02语法和命令

1.变量

image.png

image.png

2.自定义变量

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

将命令赋值给变量
_ls = ls


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

默认字符串,不会进行 + 运算
total=page_size*page_num; X(不能用)

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

declare -i total=page_size*page_num;

导出环境变量
export total

declare -x total

image.png

3系统环境变量

image.png

4配置文件加载

image.png

login_shell 登录式的shell()
从etc/profile开始
non_loginshell 非登录式的shell()
直接从/bashsrx开始

修改后想要在当前的shell中生效的话,需要执行这样一条文本 

source ~/bashsrc

5运算符和引用

image.png

在后台挂在一个程序的话,写入

node server.js(文件名) &

这个会跟随已经打开的Shell挂载,如果关闭这个shell之后依然想要挂在这个程序的话,就要搭配nohup使用

nohup node sever.js &

6管道

管道于管道符`|`,作用是将前一个命令的结果传递给后面的命令
语法

cmd1 | cmd2

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


注意:管道命令仅仅处理stdout(标准输出), 对于stderr会予以忽略,可以使用 set -o pipefail 设置shell 遇到管道错误退出
eg
cat platfrom.access.log | grep EEROR

net tatat -an | grep ESTABLISHED | wc -l

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

7重定向

image.png

8判断命令

shell中提供了test、[、[[三种判断符号, 可用于: 整数测试、字符串测试和文件测试

语法:

test condition
[ condition ]
[[ condition ]]

e.g 整数测试

test $n1 -eq $n2
test $n1 -lt $n2
test $n1 -gt $n2

字符串测试

test -z $str_a
test -n #str_a
test $str_a = $str_b

文件测试

test -e /dmt && echo "exist" //是否存在
test -f /usr/bin/npm && echo "file exist" //是否存在且为普通文件

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

image.png

9分支语句

image.png

10循环

While循环 image.png

until循环

image.png

for循环

image.png

11函数

语法一:

funcName(){echo"abc";}

语法二:

function funcName(){echo"abc";}

image.png

使用:函数之后直接加第一个第二个参数

image.png

e.g

image.png

函数内部定义变量最好使用local,即在函数定义内部变量,不会污染外部的全局作用域

12模块化

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

source [函数库的路径]

e.g

image.png

13常用命令

image.png

03Shell的执行内容和原理

1执行

1.Shell脚本一般以.sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行
```
1 #! /bin/bash
```

```
1 #! /usr/bin/env bash
```

2.启动方式
```
# 文件名运行
./filename.sh

#解释器运行
bash ./filename.sh


# source 运行
source ./filename.sh
```

2执行过程

image.png

ps.1.builtin 是内置命令

3Shell展开

1.大括号展开{...}
一般由三部分组成,前缀、一对大括号、后缀,大括号内可以是逗号分割的字符串序列,也可以是序列表达式{x..y[..incr]}

image.png

2.波浪号展开

image.png

3.参数展开 ${}

1.间接参数扩展 ${!parameter}、其中引用的参数不是parameter而是parameter的实际的值

image.png

2.参数长度:${#parameter}

image.png

3.空参数处理

image.png

4.参数切片
${parameter : offset}
${parameter : offset : length}

5.参数部分删除

image.png

4命令替换

image.png

5数学计算

image.png

6文件名替换

image.png

04调试和前端集成

1调试

1.普通log,使用echoprintf
2.使用set命令
3.vscode debug插件
一般会在最开头的时候进行配置

image.png

2VScode调试

1.shellman:代码提示和自动补全
2.shellcheck:代码语法校验
3.shell-format:代码格式化
4.Bash Debug 支持单步调试
    -安装vscode插件
    -编写launch.json文件
    -升级bash到4.x以上版本
    

image.png

3前端集成

1.node中通过exec(超过200kb会报错)、spawn调用shell命令
2.shell脚本中调用node命令
3.借助zx等库进行javascript、 shell script的融合(shell调用:$`command`)
    -借助shell完成系统操作、文件io、内存、磁盘系统状态查询
    -借助nodejs完成应用层能力,网络io,计算等