学习笔记3
第10章 sh编程
一、知识点总结
1. sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。
实践过程:
2. sh脚本与C程序
- sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行;C程序必须先编译链接到一个二进制可执行文件
- 在sh脚本中,每个变量都是字符串;在C程序中,每个变量必须有一个类型
- 在sh脚本中,第一个可执行语句是程序的入口点(不需要main函数);每个C程序必须有一个main()函数
3. 命令行参数
- 可使用与运行sh命令完全相同的参数调用sh脚本
- 在sh脚本中,可以通过位置参数访问命令行参数
实践过程:
4. sh变量
- sh有许多内置变量,如PATH、HOME、TEAM等。除内置变量外,用户还可使用任何符号作为sh变量。不需要声明。
- 所有的sh变量都是字符串,未赋值的sh变量是NULL字符串。
- 如果A是一个变量,则$A是变量的值。
实践过程:
5. sh中的引号
- \用于引用单个字符,单引号用于引用长字符串。
- 单引号内没有替换;双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。
实践过程:
6. sh语句
sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。
sh编程语言支持控制sh程序执行的测试条件、循环、case等语句。
实践过程:
7. sh命令
-
内置命令
实践过程(以read命令为例):
-
Linux命令
实践过程:
①echo命令:
②expr命令:
8. 命令替换
- $A会被替换为A值
- 当sh遇到'cmd'或$(cmd)时,会先执行cmd,然后用执行的结果字符串替换$(cmd)
实践过程:
9. sh控制语句
-
if-else-fi语句
每个语句必须在单独的一行上。但如果多个语句之间用分号分开,则sh允许多个语句在同一行。
左括号“[”是一个测试程序。运算符-eq、-ne 、-lt、-gt等将参数作为整数进行比较。测试程序还可以测试文件类型和文件属性。
if-elif-else-fi复合语句:类似于C语言中的if-else if-else。
复合条件:必须用一对匹配的双括号 [[ 和 ]] 括起来。 -
for语句
作用类似于C语言中的for循环。
实践过程:
- while语句
作用类似于C语言中的while循环。
实践过程:
- until-do语句
类似于C语言中的do-until语句。
实践过程:
教材上的代码有误
询问ChatGPT解决:
修改后:
-
case语句
类似于C语言的case语句。 -
continue和break语句
工作原理与在C语言中完全相同。
10. I/O重定向
'>file' stdout转向文件,如果文件不存在,将会创建文件。
'>>file' stdout追加到文件。
'<file' 将文件用作stdin;文件必须存在并具有r权限
'<<word' 从“here”文件中获取输入,直到只包含“word”的行。
11. 嵌入文档
可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字。这些文档通常被称为嵌入文档。通常用在sh脚本中,以生成长块的描述性文本,不需要分别回显每一行。
12. sh函数
实践过程:
使用教材上代码出现错误:
问题:使用if-else-fi语句时没有使用fi,语句使用错误。
修改后:
13. sh中的通配符
- 星号通配符:最有用,可扩展到当前目录中的所有文件。
- ?通配符:查询某文件名中的字符。
- []通配符:查询文件名中一对[]中的字符。
14. 命令分组
可以用{}或()对命令进行分组。
- {}命令分组的唯一用处是在相对环境下执行这些命令。
- ()命令分组是通过subsh进程执行()中的命令。
15. eval语句
(1)参数替换
(2)命令替换
(3)通配符扩展
16. 调试sh脚本
e.g. bash -x mysh
17. sh脚本的应用
最常用于执行涉及冗长命令序列的常规作业。
二、ChatGPT提问
三、总结
总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
要素:
- 变量和数据类型:在任何编程语言中都需要能够存储和操作数据。在shell脚本中,变量为字符串类型。
- 条件语句和循环语句。shell脚本中与C语言类似。
- 函数:函数允许组织和复用代码。在shell脚本中,也可以定义函数。
技能:
- 问题解决能力:编程本质上是一种问题解决活动。在shell脚本中,这种技能主要体现在脚本的设计和实现过程中。
- 编程语言知识:对于shell脚本来说,需要了解其语法、数据类型、控制结构、函数、错误处理等基本概念和特性。
- 调试技能:编写代码时难免会出现错误,因此需要具备调试技能,以便找出并修复这些错误。在shell脚本中,调试技能同样重要,可以使用echo、printf等命令或设陷阱(trap)等方法进行调试。
- 学习能力:由于编程技术和工具不断发展,需要具备终身学习的能力。在shell脚本中,虽然其语法相对简单,但也需要不断学习和掌握新的特性和技巧。