学习Shell的价值:
- Linux 服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署
RUN
关键词可以执行大部分的Shell命令
Step 1 Shell 基础概念
概念
终端 <=> tty
- 终端模拟器是指软件模拟tty的输入输出环境来完成软件型终端。
- Shell是终端的命令解释器,负责解释来自终端的Shell命令并且将输出的结果返回给终端。
- Bash 是Shell的一种实现,相当于Shell 的实例
发展
- Ken Thompson 在
1971
年为UNIX开发了第一个shell,即V6 shell
- Stepjen Bourne 在贝尔实验室为 V7 UNIX 所开发的 Bourne Shell 即
sh
- 开源组织GUN为了取代Bourne Shell 开发了Broune-Again shell,即
Bash
构成
Shell构成:
- 解释器
- bash内置命令
- GUN 核心工具集
- 第三方库
- 编程语言
- 变量
- 自定义变量
- 环境变量
- 系统环境变量
- 运算
- 逻辑运算符
- 算术运算符
- 语句
- 判断
- 分支
- 循环
- 函数
Step 2 命令和语法
变量
父进程和子进程 父进程在执行的时候,被触子进程时,会先执行子进程,当子进程完成后,再执行父进程的下一条命令。 其中自定义变量只能在父进程中使用,子进程无法使用,但是环境变量和系统环境变量就可以在子父进程中任意使用。
自定义变量
# 变量名=变量值 (等号左右不能有空格)
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
declare 关键字用于声明变量的类型,类似于var
系统环境变量
修改bashrc文件:
将PS1修改为\u@\h \w >>>
:
此时修改之后退出bashrc文件并未更新,输入source ~/.bashrc
即可更新
shell:
- 登陆式
- 与非登陆式相比,会先进入
/etc/profile
文件夹,然后去加载~/bash_profile
、~/bash_login
、~/.profile
- 在执行了上述流程后才会去执行~./bashrc等非登陆式流程文件
- 非登陆式
- 交互式
- 在终端等待用户的输入,处理之后将结果反馈给用户
- 非交互式
- 会直接执行用户输入的脚本,并且输出结果,不会等待用户的指令
运算符和引用
注意:
- 双引号内只有$、`、\ 保留作用
((x + y))
双括号表示算术运算cmd1||cmd2
在cmd1执行失败的时候,执行cmd2cmd1&&cmd2
在cmd1执行成功的时候,执行cmd2cmd1;cmd2
cmd1、cmd2串行并行&
让命令在后台运行,与nohup一起使用cmd &
管道
管道符|
,作用是将前一个命令的结果传递给后一个命令
语法:cmd1 | cmd2
要求: 管道右侧的命令必须能接受输入标准才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理。
注意:管道命令仅仅处理stdout,对于stderr会忽略,可以使用
set -o pipefall
设置shell遇到管道错误退出。
重定向
判断命令
注意:
- 中括号前后要有空格符
- [ 和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
- 中括号内的变量,最好是用引号括起来
- [[ 更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~ 正则
例如这里,我们使用$name == "hello" 的时候,变量在被解析后并未被双引号包裹导致报错
分支语句
if 判断
demo:
case判断
demo:
循环
while - demo:
until - demo:
for - demo:
函数
demo:
注意:
- shell自上而下执行,函数必须在使用前定义(类似于c语言)
- 函数获取变量和 shell script 类似,
$0
代表函数名,后续参数通过$1、$2……
获取- 函数内return仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用
echo、printf
,在外面使用$()、``获取结果- 如果没有return,函数状态是上一条命令的执行状态,存储在
$?
中
demo:
模块化
模块化的原理是在当前shell内执行文件,方式:source [函数库的路径]
常用命令
总结:
没有学习过linux语法之前,对于各类shell语句会感到很困惑和陌生,但是只要平时多使用,其实常用命令就那么多,多敲几次就记下来了。