第二段...
执行过程和原理
执行
1.shell脚本一般以.sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行
1 #! /bin/bash
1 #! /usr/bin/env bash
2.启动方式
1 # 文件名运行
2 #./filename.sh
3
4
5 # 解释器运行
6 bash ./filename.sh
7
8
9 # source 运行
10 source ./filename.sh
执行过程
1.字符解析
- 识别换行符、分号(;)做行的分割
- 识别命令连接符(|| && 管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
2.shell 展开,例如,例如 {1..3} 解析为 1 2 3
3.重定向,将stdin、stdout、stderr的文件描述符进行指向变更
4.执行命令
- builin 直接执行
- 非 builtin 使用$PATH查找,然后启动子进程执行
5.收集状态并返回
shell展开
1.shell展开是指在命令行中使用通配符(wildcard)和变量引用(variable expansion)来扩展(expand)命令参数。通配符可以匹配多个文件名,而变量引用可以获取变量的值并将其插入命令中。
2.以下是shell展开的一些详细语法:
-
* # 匹配任意数量的字符(包括0个) ? # 匹配一个任意字符 [characters] # 匹配一个字符集中的任意一个字符 {string1,string2,...} # 匹配多个字符串中的任意一个
- 变量展开
-
$variable # 获取变量的值并将其插入命令中 ${variable} # 同上,但是用花括号明确变量名的边界 ${variable:-word} # 如果变量未定义或为空,则使用word作为默认值 ${variable:=word} # 如果变量未定义或为空,则将word赋值给变量并使用它 ${variable:?message} # 如果变量未定义或为空,则将message打印到标准错误输出并退出脚本或命令
调试和前端集成
使用set命令设置调试选项:
set命令可以设置多种调试选项,例如-x可以输出执行的每一条命令及其参数,-v可以输出脚本中每一行执行的命令。例如:
#!/bin/bash set -x echo "开始执行脚本..." # do something set +x echo "脚本执行完成。"
在执行该脚本时,终端会输出每一条执行的命令及其参数,方便我们查看脚本执行过程。
使用trap命令捕获错误信息:
trap命令可以捕获脚本执行时的错误信息,并进行相应的处理。例如:
#!/bin/bash trap 'echo "发生错误,程序退出!"' ERR # do something
当脚本执行过程中发生错误时,终端会输出错误信息,并执行trap命令中指定的操作。这样可以及时发现错误并进行处理。