Shel l是一种命令行界面,也是一种编程语言, 熟练掌握 Shell 能够大大提升 Unix/Linux环境下的工作效率。本课程将从其发展历史、基础语法开始,通过示例逐步深入, 不仅帮助大家学会使用 Shell ,也在一定程度上去理解 Shell 的执行原理和语法设计。
学习shell的价值
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排插、资源监控等运维操作
- 使用Shell编写TCE、SCM、Docker脚本,完成服务编译和部署
Shell基础概念
- 终端
- 获取用户输入,展示运算结果的硬件设备
- 终端模拟器
- Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件
- tty
- teletypeWriter的简称,和终端等价,早期指电传打印机,在Linux中是I/O环境
- Shell
- command interpreter,处理来自终端模拟器的输入,解释执行后输出结果给终端
- Bash
- Shell的一种具体实现
发展
构成
命令和语法
- 变量
- 自定义变量
-
变量名=变量值(等号左右不能有空格) page_size=1
page_num=2
-
将命令复制给变量
_ls=ls
-
将命令结果赋值给变量
file_list=$(ls -a)
-
默认字符串,不会进行+运算
total = page_size*page_num 错!!
-
声明变量为整型
let total = page_size *page_num
declare -i total = page_size*page_num
-
导出环境变量
export total
declare -x total
-
- 系统环境变量
- 配置文件加载
- 运算符和引用
- 管道
- 重定向
- 输出重定向符号
>:覆盖写入文件
>>:追加写入文件
2>:错误输出写入文件
&>:正确和错误输出统一写入到文件中
*输入重定向符号
< <<
- 判断命令
- 分支语句
- 语法一
if condition;then
程序段
elif condition ; then
程序段
esle
程序段
fi
* 语法二
case $变量 in:
“第一个变量内容")
程序段
;;
“第一个变量内容")
程序段
;;
*)
程序段
;;
esac
- 循环
- while
while condition ; do 程序段;done
* until
until condition ; do 程序段;done
* for
for var in [words...];do 程序段;done
- 函数
- 语法一
funcName(){echo "abc";}
* 语法二
function funcName(){echo "abc";}
- 模块化
-
模块化的原理是在当前Shell内执行函数文件,方式:
source[函数库的路径]
-
- 常用命令
执行过程和原理
- 执行
- Shell脚本一般以 .sh结尾,也可以没有,这是一个约定,第一行需要指定用什么命令解释器来执行
#! /bin/bash
#! /usr/bin/env bash
* 启动方式
-
执行过程
- 字符解析
识别换行符、分号(;)做行的分割
识别命令连接符(|| && 管道)做命令的分割
识别空格、tab符,做命令和参数的分割
- shell展开,例如{1..3}解析为 123
- 重定向,将stdin、stdout、stderr的文件描述符进行指向变更
- 执行命令
builtin 直接执行
非builtin 使用 ¥PATH 查找,然后启动子进程执行
- 收集
-
shell展开
* 大括号展开
* 波浪号展开
* 参数展开
* 命令替换
* 数学计算
* 文件名展开