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

169 阅读3分钟

Shell脚本和编程

学习shell的价值:

1.Linux服务器的基本操作和管理

2.前端Node.js服务的进程管理、问题排查、资源监控等运维操作

3.使用shell便携TCE、SCM、Docker脚本,完成服务编译和部署

shell编程很重要

01shell的基础概念

终端:获取用户输入、展示运算结果的硬件设备

tty:输入、输出 环境

终端模拟器:macTerminal、iTERn2等,关联虚拟tty等输入输出软件

shell:command interpreter,处理来自终端模拟其等输入,解释执行之后输出结果给终端

Bash:shell等一种具体实现

shell的发展

shel的构成:是一个解释器也是一个编程语言

shell不仅提供了与内核和设备交互的方法,还继承了一些今天软件开发中通用的设计模式(比如管道和过滤器)们举杯控制流程,循环,变量,命令查找的机制

即是命令解释器,也是一门编程语言

02语法和命令

父进程执行第三方或核心工具时启动子进程,然后还给父进程。环境变量在父进程和子进程都可以进行

ding@bogon ~ % echo $HOME
/Users/ding
ding@bogon ~ % echo $USER
ding
ding@bogon ~ % echo $PS1
%n@%m %1~ %# 
ding@bogon ~ % echo $PATH
/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/ding/Library/Application Support/JetBrains/Toolbox/scripts
ding@bogon ~ % vim ~/.bashrc

.bashrc是home目录下的一个shell文件,用于储存用户的个性化设置。在bash每次启动时都会加载.bashrc文件中的内容,并根据内容定制当前bash的配置和环境。

补充: .bash_profile和.bashrc的区别?

两者在登陆bash时都会被bash执行,但是.bash_profile只在会话开始时被读取,而.bashrc在每次打开新的终端时都会被读取。

通过系统用户登陆默认运行的shell

非登陆交互式运行shell执行脚本运行非交互式shell

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

如果修改了配置文件,不会立即生效,需要我们重启中断或者执行source命令

管道:管道与管道符|,作用时讲前一个命令的结果传递给后面的命令

语法:cmd1|cmd2

要求管道右侧的命令必须能接受标准输入才行

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

exit:手动退出shell的命令

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

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

分支语句:

循环:

函数:

为了函数内定义的变量不污染全局,我们最好用local去定义,或者在函数退出之前使用unset去处理一下

模块化:

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

source【函数库的路径】

常用命令:

03执行过程和原理

1.shell脚本一半以.sh结尾,也可以没有,这是一个约定,第一行需要制定用什么命令解释器来执行

2.启动方式

:一个是直接用文件名运行,第二个用解释器运行,第三个用source

1.字符解析

识别换行符、分毫做行的分割

识别命令连接符(|| && 管道)做命令分割

识别空格、tab符,做命令和参数的分割

2.shell展开,例如(1..3)解析为1 2 3

3.重定向,将stdin、stdout、stderr文件描述符进行指向变更

4.执行命令

builtin直接执行,非builtin使用$PATH查找,然后启动子进程执行

5.收集状态并返回

shell展开

大括号展开:一般由三部分组成、前缀,一对大括号、后缀,大括号内可以时都好分割的字符串序列,也可以时序列表达式

波浪号展开

shell展开

间接参数扩展 S(parameter}其中引用的参数开不是parameter而是parameter的实际的值

2.参数长度S(#parameter)

3.空参数处理

S(parameler:-word]# 为空替换

S{parameter:=word)#为空替换,并将值赋给Sparameter变量S(parameler:?word)#为空报错

S[parameter:+word)#不为空替换

4,参效切片

S( parameter: offset)S( parameter offset: length)

5.参数部分删除S{parameter%word)# 最小限度从后面截取worcS(parameter%6%word)#最大限度从后面截取worS(parameter#word)# 最小限度从前面截取wordS(parameter##word)# 最大限度从前面藏取word

#!/bin/sh
str=abcdefg
spl=S{str##*d)
sp2-$(strssd*)
echo Sspl输出 efg
echo ssp2输出 abc

命令替换

在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有两种:$(...)或"..."

数学计算 (ArithmnstoErseraen]

文件名展开(FilenameExpansion)[..]外壳文件名模式匹配当有单词没有被引号包裹,日其中出现了,‘’,‘?’and [字符,则 shell :会丢按照正则匹配的方式音找文件名进行养换, 如果没找到则保持不变.

调试和前端集成

调试:1.普通log,使用echo、printf

2.使用set命令

3.vscode debug插件

前端集成