shell脚本和编程
课程介绍
价值:Linux服务器基本操作和管理
前端node.js服务的进程管理、问题排查、资源监控等
使用shell编写TCE,SCM,docker脚本
01 shell的基本概念
终端:获取用户输入设备
Tty:teletypewriter的简称,和终端等价
终端模拟器:mac terminal iterm2等关联虚拟tty的输入输出软件
Shell:command inteerpreter处理来自终端模拟器的输入,解释执行后输出结果给终端
Bash:shell的一种具体实现
发展:
贝尔实验室为Linux开发了第一个v6 shell
为v7linux 开发sh(大名鼎鼎)
开源组织gnu为取代bourne shell开发了bash
(mac最近版本都将shell切换为zsh
构成:(是一种编程语言)
02 语法和命令
变量:
父子shell:启动子进程shell帮助父进程完成,完成后父进程继续下一命令
系统环境变量:
#0 当前shell名称 脚本名称 2等可以获取到传入参数
# 传入脚本的参数数量 if[#-gt 1 ]
$✳️ 传入脚本的所有参数
?-eq0]
$PS1 命令提示符 export PS1=”\U@\h\w>” (用户名、主机名、目录)
$HOME 用户主文件夹 cd~
PATH:[]
02 配置文件加载
登陆式和非登陆式(交互式或非交互式)
Source~.bashrc 执行脚本
运算符和引用
比较符号和其他编程语言没什么区别
How to访问这个服务器 以及如何后台运行 关闭shell后仍然运行(nohup&)
访问:hello,world
管道
管道与|管道符,作用是将前一个命令的结果传递给后面的命令
语法:cmd1|cmd2
Eg:
要求:1.管道右侧的命令必须能够接受标准输入,比如grep命令可以直接使用,但是is,mv等不可以直接使用,则可以用xargs进行预处理(管道右边加xargs)
2.管道命令仅仅处理stdout,对于stderr会忽略(不会报错),可以使用set-o pipefall设置遇到管道错误退出。
重定向
把输入结果导向到别的地方,而非默认指向终端 eg:
报错后,导向到别的文件
于是read-cut第一行(信息)到auth文件
判断命令
[、[[、test三种判断符号
-e看文件是否存在,-f看文件是否存在且是否为普通文件
注意:
中括号:前后必须空格做分割
[,test是命令,只能使用自己支持的标志位
<=只能做字符比较,不能整数比较
中括号内的变量,最好都引号括起来
[[更丰富、在数型比较中支持,<>=,在字符串中支持=~正则表达式
分支语句:
语法一
If condition;then
程序段
Elif condition;then
程序段
Else
程序段
Fi
语法二
循环
while循环:(条件成立,继续循环)
While condition;do 程序段;done
Until(条件成立,跳出循环)
Until condition ;do 程序段;done
for循环:(对列表循环)
For var in 【words…】;do程序段 ;done
函数($符号获取参数)
语法一
funcName ()(echo”abc”;)
语法二
Function funcName()(echo”abc”;)
注意:
状态码:echo $?
执行结果:echo $content
模块化
Source[函数库的路径]
常用命令
03 执行过程和原理
执行
shell脚本一般以.sh结尾,也可以没有,
这是一个约定,第一行需要指定用什么命令解释器来执行
前两种是在子进程中运行,第三种是在该进程中运行
执行过程:
字符解析-shell展开-重定向-执行命令-收集状态并返回
shell展开类型:
1.大括号展开:由三部分构成,前缀,一对大括号,后缀,大括号内可以是逗号分隔的字符串序列也可以是序列表达式
2.波浪号展开
3.参数展开
3.命令替换
4.数学计算
5.文件名展开
04 调试以及和前端项目做集成
调试:
1.普通log,使用echo,printf
2.使用set命令
(-u :遇到不存在的变量报错并终止
-x :运行结果前,现输出执行那一命令
-e :只要发生错误,就终止执行
-o pipefall:只要一个子命令失败,整个管道命令就失败,脚本终止执行)
3.Vscode debug插件
1,shellman插件 代码自动提示补全
2.shellcheck 代码语法校验
3.Shell-format 代码格式化
4.bash debug:支持单步调试
(安装vscode visual studio code插件 编写launch.json文件 升级bash到4.x以上版本)
前段集成
Shell 调用:$’command’
课程总结