学习shell的价值
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问卷排查、资源监控等运维操作
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署
shell基础概念
- 终端:获取用户输入、展示运算结果的硬件设备
- tty:teletypeWrier的简称,和终端等价,早期指电传印机,在linux中是输入/输出 环境
- 终端模拟器:Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件
- Shell:command interpreter,处理来自终端模拟器的输入,解释执行后输出结果给终端
- Bash:shell的一种具体实现
发展
Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell
↓
Stephen Bourne 在贝尔实验室为V7UNIX所开发的Bourne shell,即sh
↓
开源组织GNU为了取代Bourne shell开发的Bourne-Again shell开发的Bourne-Again shell,即Bash
除了替代v6 shell,sh还有几个优点,把控制流程,循环,变量引入了脚本,提供了一种的更具功能性的语言
主流Linux系统使用的shell,许多都以它为锚点。
bash是sh的超集,可以直接执行大部分sh脚本。
Bash在兼容Bourne shell脚本编程的同时,集成了Korn shell和shell的功能,包括命令历史,命令行编辑,目录堆栈(pushd和popd),一些实用环境变量,命令自动补全等。
shell构成
shell不仅提供了与内核和设备交互的方法,还集成了一些今天软件开发中通用的设计模式(比如管道和过滤器),具备控制流程,循环,变量,命令查找的机制
即是命令解释器,也是一门编程语言,作为命令解释器,他提供给用户接口,实用丰富的GNU工具集,第三方的或者内置的,比如cd、pwd、exec、test、netstat等等
命令和语法
变量
自定义变量
系统环境变量
配置文件加载
运算符和引用
管道
语法:cmd1|cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,使用xargs预处理
注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail设置shell遇到管道错误退出
#!/bin/bash
cat platform.access.log | grep ERROR
netstat -an | grep ESTABLISHED | wc-1
find .-maxdepth 1 -name "*.sh" | xargs ls -1
重定向
判断命令
- 整数测试
- 字符串测试
- 文件测试
- test condition
- [ condition ]
- [[ condition ]]
- 中括号前后要有空格符
- [ 和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
- 中括号内的变量,最好都是用引号括起来
- [[ 更丰富,在整形中支持<、>、=,在字符串比较中支持=~正则
#!/bin/bash
#整数测试
test $n1 -eq $n2
test $n1 -lt $n2
test $n1 -gt $n2
#字符串测试
test $n1 -z $str_a
test $n1 -n $str_a
test $n1 -$str_a = $str_b
#文件测试
test -e /dmt && echo "exist"
test -f /usr/bin/npm && echo "file exist"
#!/bin/bash
name="hello world"
[ $name == "hello" ]
script.sh:line5:[:too many argruments
Exited with error status 2
执行过程和原理
执行
#!/bin/bash
#!/usr/bin/env bash
#文件名运行
./filename.sh
#解释器运行
bash ./filename.sh
#source运行
source ./filename.sh
执行过程
- 识别换行符,分号做行的分割
- 识别命令连接符(|| && 管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
- builtin直接执行
- 非builtin使用\color{skyblue}{5.收集状态并返回}$
调试和前端集成
调试
#! /bin/sh
set -uxe -o pipefail
echo "hello world"
#! /bin/sh
a=1
b=(1 2 3 4 5)
echo $a
echo ${d[3]}
echo ${d[@]}
#输出
#1
#4
#1 2 3 4 5
VSCode配置
- 安装vscode插件
- 编写launch.json文件
- 升级bash到4.x以上版本
前端集成
- 借助shell完成系统操作,文件io、内存、磁盘系统状态查询等
- 借助nodejs完成应用层能力,网络io、计算等