Shell脚本和编程 | 青训营笔记

95 阅读1分钟

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

常用命令

image-20230530224409906.png

-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.收集状态并返回