《Unix&Linux系统编程》第十章学习笔记
第10章 sh编程
10.1 sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。sh脚本的第一行通常以#!组合开始,成为shebang,当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。shebang允许主sh 调用适当版本的sh来执行脚本,如果未指定shebang,它将运行默认的sh。
10.2 sh脚本与C程序
sh是一个解释程序,逐行读取sh脚本并直接执行这些行,如果行是可执行命令且为内置命令,那么sh可以直接执行,否则它会复刻一个子进程来执行命令,并等待子进程终止后再继续。
相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。其次,C程序中,每个变量必须有一个类型,而sh脚本中每个变量都是字符串。
10.3 命令行参数
-
可以通过位置参数$0、$1、$2等访问命令行参数,前10个用$0$9,其他参数必须称为${10}${n}(n>10)。
-
$#=命令行参数$1到$n的数量
-
$*=所有命令行参数,包括$0
-
$S=执行sh的进程PID
-
$?=最后一个命令执行的退出状态(成功为0,否则为非0)
10.4 sh变量
sh
有许多内置变量,如PATH、HOME、TERM等。
除了内置变量外,用户还可使用任何符号作为sh变量,不许声明。未赋值的sh变量是NULL字符串,赋值方法如下:
variable=string
10.5 sh中的引号
如果想把$、/、*、>、<等用作普通字符,可使用\或单引号来引用他们。
通常\用于引用单个字符,单引号用于引用长字符串。
10.7 sh命令
1、内置命令
命令 | 说明 |
---|---|
.flie | 读取并执行文件 |
break[n] | 从最近的第n个嵌套循环中退出 |
cd[dirname] | 更换目录 |
continue[n] | 重启第n个嵌套循环 |
eval[arg...] | 计算一次参数并让sh执行生成的命令 |
exec[arg...] | sh将会退出 |
exit[n] | 使sh退出,退出状态为n |
export[var...] | 将变量到处到随后执行的命令 |
read[var...] | 从stdin中读取一行并未为变量赋值 |
set[arg...] | 在执行环境中设置变量 |
shift | 将位置参数$2$3...重命名为$1$2... |
trap[arg][n] | 接收到信号n后执行参数 |
umask[ddd] | 将掩码设置为八进制数ddd |
wait[pid] | 等待进程pid,若没给出pid,则等待所有活动子进程 |
2、Linux命令
echo命令:将参数字符串作为行回显到stdout,它通常将相邻的多个空格压缩为一个,除非有引号。
expr命令:间接更改sh变量的值(数量),它是一个程序,运行方式如下:
expr string1 OP string2
管道命令:在sh脚本中经常使用管道作为过滤器。
实用命令:
-
awk:数据处理程序
-
cmp:比较两个文件
-
comm:选择两个排序文件共有的行
-
grep:匹配一系列文件的模式
-
diff:找出两个文件的差异
-
join:使用相同的键来记录以比较两个文件
-
sed:流或行编辑命令
-
sort:排序或合并
-
tail:打印某文件的最后n行
-
tr:一对一字符翻译
-
uniq:从文件中删除连续重复行
10.9 sh控制语句
1、if-else-fi语句
if [condition];then
statements
else
statements
fi
2、if-elif-else-fi复合语句
if [condition1];then
commands
elif [condition2];then
commands
else
commands
fi
3、for语句
for VARIABLE in string1 string2 ... stringn
do
commands
done
4、while语句
while [condition]
do
commands
done
5、until-do语句
until [$ANS = "give up"]
do
echo -n "enter your answer:"
read ANS
done
6、case语句
case $variable in
pattern1) commands;;
pattern2) commands;;
patternN) commands;;
esac
7、continue语句和break语句
continue重启最近循环的下一个迭代,break退出最近循环
10.10 I/O重定向
形式 | 含义 |
---|---|
>file | stdout转向文件,若文件不存在则创建 |
>>file | stdout追加到文件 |
<file | 将文件用作stdin;文件必须存在并具有r权限 |
<<<word | 从“here”文件中获取输入,直到只包含“word”的行 |
10.12 sh函数
func()
{
#function code
}
10.13 sh中的通配符
-
星号通配符
-
?通配符
-
[]通配符
10.14 命令分组
在sh脚本中,可以用{}或()对命令进行分组。
10.15 调试sh脚本
由带有-x选项的子sh运行
问题与解决思路
1、总结一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
(1)要素:
- 数据类型
- 常量
- 变量
- 运算符
- 表达式
- 标识符
- 关键字
- 数组
- 基本控制结构
- 函数
- 输入和输出
- 解释器和编译器
(2)技能: - 数据结构的分析和设计
- 算法(即处理逻辑,微观层次)的分析和设计
- 系统架构(即处理逻辑,宏观层次)的分析和设计
(3)shell脚本: - 用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
- 提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。