shell基础和语法
模块化
模块化的原理是在当前shell内执行函数文件,方式:
source [函数库的路径]
定义一个math函数
#!/bin/bash
#add函数
# @return platForm
function add(){
declare -i res=$1+$2
echo $res
}
引用math函数
#!/bin/bash
source './math.sh'
total=$(add 1 2)
echo $total
常用命令
-A3:after在匹配行之后显示三行上下文
-B3:before前三行在匹配行之前显示 3 行上下文
-t “ ”:以空格分割
-f:跟踪文件的变化,如果文件被修改或更新,命令会自动执行,并在屏幕上输出新的行
shell执行过程和原理
执行
1、shell脚本一般以.sh结尾,也可以没有,因为在Linux当中不是以后缀名来做类型的判断,这是一个约定;第一行需要指定用什么命令解释器来执行
#!/bin/bash
#!/usr/bin/env bash
2、启动方式
#文件名运行
./filename.sh
#解释器运行
bash ./filename.sh
#source运行
source ./filename.sh
前两种脚本在子进程当中执行,source会在当前的进程当中执行脚本
执行过程
shell脚本在启动之后会交给bash解释器去执行
解释器内部会经历这样几个阶段:
1.字符解析
- 识别脚本的换行符、分号(;),做行的分割
- 识别命令连接符(|| && 管道),做命令的分割
- 识别空格、tab符,做命令和参数的分割
经历了字符解析阶段,bash就得到了最基本可以执行的命令了
2.shell展开,例如{1..3}解析为1 2 3
1.大括号展开(Brace Expansion) {...}
2.波浪号展开(Tilde Expansion) ~
3.参数展开(Shell Paramenter Expansion)
4.命令替换(Command Substitution)
5.数学计算(Arithmetic Expansion) $((..))
6.文件名展开(Filename Expansion) * ?[..]外壳文件名模式匹配
3.重定向,将stdin、stdout、stderr的文件描述符进行指向变更
4.执行命令
- builtin直接执行
- 非builtin使用$PASH查找,然后启动子进程执行
5.收集状态并返回