学习笔记3
关于知识点
知识点归纳
第十章
- 10.1 sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。 - 10.2 sh脚本与C程序
Shell脚本(sh脚本)和C程序是两种不同的编程语言和编程环境,它们有各自的特点和应用场景。- Shell脚本(sh脚本):
- 脚本语言:Shell脚本是一种脚本语言,通常用于执行一系列操作,如文件操作、进程控制、系统管理等;
- 解释性语言:Shell脚本是解释性语言,代码逐行执行,无需编译过程;
- 脚本文件:通常以.sh作为文件扩展名,可以通过chmod命令添加执行权限后直接运行;
- 环境变量:Shell脚本可以访问和修改环境变量,这对于配置和自定义环境非常有用;
- 流程控制:支持条件语句(if-else)、循环语句(for、while)、函数定义等基本的流程控制结构;
- 管道和重定向:Shell脚本允许使用管道操作符(|)和重定向符号(>、<)来处理输入和输出;
- 内置命令:Shell脚本有许多内置命令,如echo、ls、grep等,用于执行常见的操作;
- 脚本的用途:用于自动化任务、系统管理、日常操作等,特别适用于Linux和Unix系统;
- C程序:
- 编译型语言:C是一种编译型语言,需要通过编译器将源代码编译成可执行文件,然后才能运行;
- 静态类型语言:C是一种静态类型语言,需要在编写代码时显式声明变量的数据类型;
- 高性能:C语言通常用于编写高性能的系统级程序,如操作系统、驱动程序和嵌入式系统;
- 指针:C语言具有强大的指针支持,允许直接操作内存地址,但也容易引发内存管理问题;
- 库函数:C语言提供了丰富的标准库函数,用于执行各种任务,如字符串处理、文件操作等;
- 跨平台:C语言可以编写跨平台的程序,只需对不同平台进行少量调整即可;
- 多线程支持:C语言支持多线程编程,使其适用于并发和并行编程;
- 系统编程:常用于开发操作系统、设备驱动程序、网络协议等低层次的系统软件;
总的来说,Shell脚本主要用于自动化任务和系统管理,适合处理高级系统命令和文本操作,而C语言通常用于开发高性能、系统级别的应用程序,需要更多的底层控制和内存管理。选择使用哪种语言取决于具体的需求和应用场景。
- 10.3 命令行参数
- $# = 命令行参数$1到$n的数量
- $* = 所有命令行参数,包括$0
- $S = 执行sh的进程PID
- $?= 最后一个命令执行的退出状态(如果成功则为0,否则为非0)
- 10.4 sh变量
- 10.5 sh中的引号
- 10.6 sh语句
- 10.7 sh命令
- 内置命令
- Linux命令
- 10.8 命令替换
- 10.9 sh控制语句
- 10.9.1 if-else-if语句
在sh(Shell)脚本中,if-else-if语句用于根据不同条件执行不同的代码块。
- 10.9.1 if-else-if语句
- 基本语法:if-else-if语句的基本语法如下:
if [ condition1 ]; then
# 执行代码块1
elif [ condition2 ]; then
# 执行代码块2
elif [ condition3 ]; then
# 执行代码块3
else
# 执行默认代码块
fi
-
条件判断:条件表达式使用方括号
[]
将条件包含起来,并在方括号之间使用运算符进行逻辑判断。常见的条件运算符包括等于(-eq
)、不等于(-ne
)、大于(-gt
)、小于(-lt
)、大于等于(-ge
)、小于等于(-le
)等。 -
代码块:每个条件都对应一个代码块,其中包含要执行的命令或操作。代码块通常由缩进表示,并在条件之后使用
then
关键字开始。 -
多个条件:if-else-if语句可以包含多个条件和对应的代码块。条件按照从上到下的顺序进行匹配,只有第一个匹配的条件的代码块将被执行。
-
else语句:如果所有条件都不满足,则可以在if-else-if语句的末尾添加一个
else
代码块。该代码块表示默认情况下要执行的代码。 -
嵌套语句:if-else-if语句可以嵌套在其他if-else-if语句或循环语句中。这允许更复杂的逻辑和条件判断。
-
注释:在代码块中可以使用注释来提供关于代码功能和用途的说明。注释以
#
开头,并在行末尾结束。 -
退出状态码:根据每个代码块的执行结果,if-else-if语句可以返回不同的退出状态码,用于指示脚本的执行结果。
- 10.9.2 for语句
在sh(Shell)脚本中,for语句用于循环遍历一组元素或执行一系列操作。
- 10.9.2 for语句
-
基本语法:for语句的基本语法如下:
for variable in element1 element2 element3 ...; do
# 执行循环中的代码块
done
其中,variable
是一个变量,用于依次存储循环中的每个元素,element1 element2 element3 ...
是要遍历的元素列表。
2. 元素列表:元素列表可以包含一系列的字符串、数字、文件名等元素,用空格或其他分隔符分隔开。for循环会依次将列表中的元素赋值给变量,并执行相应的代码块。
3. 代码块:在for循环中,每次迭代都会执行一个代码块,该代码块通常由缩进表示。我们可以在代码块中执行任意操作,包括条件判断、命令执行等。
4. 遍历文件列表:常见用途之一是遍历文件列表。例如,可以使用通配符(如*
)来匹配一组文件,然后在for循环中处理这些文件。
5. 计数循环:除了遍历元素列表,for循环还可以用于创建计数循环。可以使用seq
命令生成数字序列,然后在for循环中使用这些数字。
6. 循环控制:在循环中,可以使用break
语句提前退出循环,或者使用continue
语句跳过当前迭代,继续下一次迭代。
7. 嵌套循环:我们可以在一个循环内嵌套另一个循环,以实现更复杂的控制逻辑。例如,在外部循环中遍历文件列表,在内部循环中处理每个文件的内容。
8. 变量使用:在for循环中,可以使用$variable
来引用当前迭代中的元素。这允许我们在代码块中使用该元素的值。
for语句是sh脚本中用于循环遍历元素列表或执行计数循环的关键工具。它使得脚本编写和数据处理更加灵活和自动化。
- 10.9.3 while语句
在sh(Shell)脚本中,while语句用于创建一个循环,只要指定的条件为真,就会重复执行一系列操作。
- 基本语法:while语句的基本语法如下:
while [ condition ]; do
# 执行循环中的代码块
done
其中,condition
是一个用于判断是否继续循环的条件表达式。只要条件为真,循环就会继续执行,直到条件为假。
2. 条件判断:条件表达式使用方括号[]
将条件包含起来,并在方括号之间使用运算符进行逻辑判断。常见的条件运算符包括等于(-eq
)、不等于(-ne
)、大于(-gt
)、小于(-lt
)、大于等于(-ge
)、小于等于(-le
)等。
3. 代码块:在while循环中,只要条件为真,就会反复执行一个代码块,该代码块通常由缩进表示。您可以在代码块中执行任意操作,包括条件判断、命令执行等。
4. 循环控制:在循环中,可以使用break
语句提前退出循环,或者使用continue
语句跳过当前迭代,继续下一次迭代。
5. 条件更新:在循环中,通常需要在代码块中更新条件,以便最终条件为假,循环能够结束。如果不更新条件,可能会导致无限循环。
6. 嵌套循环:我们可以在一个循环内嵌套另一个循环,以实现更复杂的控制逻辑。这允许我们创建嵌套的循环结构。
7. 无限循环:有时,当我们希望创建一个无限循环,以等待某些条件的发生,这可以通过设置条件始终为真来实现。
8. 变量使用:在while循环中,我们可以使用$variable
来引用当前迭代中的元素。这允许我们在代码块中使用该元素的值。
- 10.9.4 until-do语句
在sh(Shell)脚本中,until-do语句用于复执行一系列操作,直到指的条件为真。与while-do语句不,until-do循环在条件为假时执行,直到条件变为真才停止循环。
- 基本语法:until-do语句的基本语法如:
until [ condition ]; do
# 执行循环中的代码块
done
其中,condition
是一个用于判断是否继续循环的条件表达式。只要条件为假,循环就会继续执行,直到条件为真。
2. 条件判断:条件表达式使用方括号[]
将条件包含起来,并在方括号之间使用运算符进行逻辑判断。常见的条件运算符包括等于(-eq
)、不等于(-ne
)、大于(-gt
)、小于(-lt
)、大于等于(-ge
)、小于等于(-le
)等。
3. 代码块:在until循环中,只要条件为假,就会反复执行一个代码块,该代码块通常由缩进表示。我们可以在代码块中执行任意操作,包括条件判断、命令执行等。
4. 循环控制:在循环中,可以使用break
语句提前退出循环,或者使用continue
语句跳过当前迭代,继续下一次迭代。
5. 条件更新:在循环中,通常需要在代码块中更新条件,以便最终条件为真,循环能够结束。如果不更新条件,可能会导致无限循环。
6. 嵌套循环:我们可以在一个循环内嵌套另一个循环,以实现更复杂的控制逻辑。这允许我们创建嵌套的循环结构。
7. 无限循环:有时,当我们希望创建一个无限循环,以等待某些条件的发生,这可以通过设置条件始终为假来实现。
总之,until-do语句是sh脚本中用于创建循环的关键工具,它使得可以根据条件反复执行一系列操作,直到条件变为真为止。掌握until-do语句可以帮助您更灵活地编写Shell脚本。
- 10.9.5 case语句
在sh(Shell)脚本中,case语句用于根据不同的选项或值执行相应的代码块。
- 基本语法:case语句的基本语法如下:
case expression in
pattern1)
# 执行代码块1
;;
pattern2)
# 执行代码块2
;;
pattern3)
# 执行代码块3
;;
*)
# 执行默认代码块
;;
esac
在这里,expression
是待匹配的表达式或变量,pattern1
、pattern2
等是用于匹配expression
的模式,;;
用于结束每个模式下的代码块,*)
表示默认匹配。
2. 模式匹配:case语句中的模式使用通配符来匹配expression的值。通配符可以是*
(匹配任意字符)、?
(匹配任意单个字符)和[...]
(匹配字符集合中的任意一个字符)。
3. 代码块:每个模式匹配都对应一个代码块,其中包含要执行的命令或操作。代码块通常由缩进表示,并使用;;
在每个模式下结束。
4. 多个模式:case语句可以包含多个模式和对应的代码块。当expression与某个模式匹配时,会执行相应的代码块,并且只有第一个匹配的模式将被执行。
5. 默认模式:如果expression与所有模式都不匹配,可以使用*)
模式来指定默认的匹配情况。这通常用于处理未匹配的情况。
6. 逻辑操作:在每个模式中,可以使用|
运算符进行逻辑或操作,允许多个模式共享相同的代码块。
7. 嵌套case:我们可以在一个case语句内部嵌套另一个case语句,以实现更复杂的控制逻辑。这允许创建嵌套的case结构。
8. 变量使用:在case语句中,可以使用$variable
来引用expression的值。这允许在代码块中使用该值。
- 10.9.6 continue和break语句
在sh(Shell)脚本中,continue和break语句用于在循环中控制流程的执行。
- continue语句:continue语句用于跳过当前迭代中的剩余代码,直接进入下一次迭代。当遇到continue时,循环会立即跳到下一次迭代的起始处。
- break语句:break语句用于完全结束循环的执行。当遇到break时,循环会立即终止,不再执行剩余的代码,并跳出循环。
- 在循环中使用:continue和break语句通常用于循环结构(如for、while和until)。在循环中,根据具体的需求,可以使用continue来跳过某些迭代,或者使用break来提前结束循环。
- 嵌套循环中的控制:在嵌套循环中,continue和break语句通常用于控制内部循环的执行。使用continue语句可以跳过当前迭代并进入下一次迭代,而使用break语句可以完全退出内部循环。
- 循环控制的条件判断:通常,continue和break语句结合使用特定的条件判断语句来实现循环控制。根据条件的满足与否,使用continue来继续循环或使用break来提前结束循环。
- 适用于不同的循环类型:continue和break语句可以在for、while和until等循环中使用。无论是计数循环、条件循环还是无限循环,这两个语句都适用。
- 多层循环中的控制:当有多层嵌套循环时,continue和break语句可以在内层循环中影响外层循环的执行。通过控制内层循环的执行流程,可以实现对外层循环的控制。
- 10.10 I/O重定向
- 10.11 嵌入文档
- 10.12 sh函数
- 10.13 sh中的通配符
- 10.14 命令分组
- 10.15 eval语句
苏格拉底挑战
问题1:
问题2:
遇到问题以及实践过程截图
实践截图
问题1: