学习Shell的价值
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
- 使用Shell编写TCE、SCM、Docker脚本,完成服务编译和部署
Shell基础概念
概念
Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机的控制。
- 终端:获取用户输入、展示运算结果的硬件设备
- tty:teletypeWriter的简称、和终端等价,早期指电传印机,在Linux中是输入/输出环境
- 终端模拟器:Mac Terminal,iTern2等,关联虚拟机tty的输入输出软件
- Shell:command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端
- Bash:Shell的一种具体实现
发展
- Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell。
- Stephen Bourne在贝尔实验室为V7 UNIX所开发的Bourne shell,即sh。
- 开源组织GUN为了取代Bourne shell开发的Bourne-Again shell,即Bash。
构成
语法和命令
变量
自定义变量
#1/bin/bash
# 这是脚本文件的shebang,它告诉系统脚本文件使用哪种解释器来执行。在这个例子中,使用的是bash解释器
#变量名=变量值(等号左右不能有空格),定义了两个变量page_size和page_num,并分别给它们赋值为1和2
page_size=1
page_num=2
#将命令复制给变量
_ls=ls
#将命令结果赋值给变量
file_list=$(ls -a)
#默认字符串,不会进行+运算
total=page_size*page_num
declare -x total
declare选项的含义
选项 | 含义 |
---|---|
- | 给变量设定类型属性 |
+ | 取消变量的类型属性 |
-a | 将变量声明为数组类型 |
-i | 将变量声明为整数型 |
-x | 将变量声明为环境变量 |
-r | 将变量声明为只读变量 |
-p | 显示指定变量的被声明的类型 |
系统环境变量
$#
表示当前脚本或函数的参数个数。在shell脚本中,可以通过$#
来获取当前脚本或函数的参数个数,并根据参数个数执行相应的操作。$*
表示当前脚本或函数的所有列表参数。在shell脚本中,可以通过$*
来获取当前脚本或函数的所有参数,并根据参数列表执行相应的操作。$?
- 表示上一个命令的退出状态码。在shell脚本中,可以通过$?
来获取上一个命令的退出状态码,并根据状态码执行相应的操作。$PS1
表示shell提示符的格式。在shell中,可以通过修改$PS1
来自定义shell提示符的格式,以适应个人习惯或需求。$HOME
表示当前用户的主目录。在shell脚本中,可以通过$HOME
来获取当前用户的主目录,并根据主目录执行相应的操作。$PATH
表示系统的可执行文件路径列表。在shell中,可以通过修改$PATH
来添加或删除系统的可执行文件路径,以便更方便地执行系统命令或自定义命令。
配置文件加载
运算符和引用
管道
管道与管道符|,作用是将前一个命令的结果传递给后面的命令 语法:cmd1 | cmd2 要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理 注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -0 pipefail设置shell遇到管道错误退出
#!/bin/bash
cat platform.sccess.log \ grep ERROR
netstat -an | grep ESTABLISHED | wc -l
find . -maxdepth l -name "*.sh" | xargs ls -l
重定向
判断命令
shell中提供了test、[、[[三种判断符号,可用于:
- 整数测试
- 字符串测试
- 文件测试
语法
- test condition
- [ condition ]
- [[ condition ]]
注意
- 中括号前后要有空格符
- [ 和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
- 中括号内的变量、最好都是引号括起来
- [[更丰富,在整型比较中支持< 、> 、=,在字符串比较中支持=~正则
分支语句
循环
- 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自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,1、$2...获取
- 函数内return仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用echo、printf,在外面使用$0、`` 获取结果
- 如果没有return,函数状态是上一条命令的执行状态,存储在$?中
模块化
模块化的原理是在当前shell内执行函数文件,方式:source[函数库的路径]
常用命令
执行过程及原理
执行过程
shell展开
- 大括号展开(Brace Expansion}{...}
- 波浪号展开(Tilde Expansion)~
- 参数展开(Shell Parameter Expansion)
- 命令替换(Command Substitution)
- 数学计算(Arithmetic Expansion) $((...))
- 文件名展开(Filename Expansion) * ? [..] 外壳文件名模式匹配