一、课程知识点
- shell基本概念
- 命令
- 重定向
- 模块化
- 执行过程和原理
二、shell基本概念
- Shell(也称为命令行界面或终端)是一种通过文本输入和输出进行交互的计算机用户界面。它允许用户通过输入命令来执行操作、运行程序和管理系统
- 命令(Command):Shell通过输入命令来执行不同的操作或任务,例如创建文件、复制文件、移动文件、运行程序等。命令通常由命令名和参数组成,命令名指定要执行的操作,参数用于指定命令的具体操作方式或作用对象。
- 提示符(Prompt):Shell在等待用户输入命令时会显示一个提示符,通常是一个特殊的字符或字符串,表示Shell已经准备好接受命令输入。
- 文件系统(File System):Shell可以用于管理计算机上的文件和目录,包括创建、复制、移动、删除、重命名、查看等操作。Shell使用文件系统的路径来定位文件和目录,例如绝对路径(从根目录开始的完整路径)和相对路径(从当前目录开始的相对路径)。
- 管道(Pipeline):Shell允许将多个命令通过管道连接起来,其中一个命令的输出作为另一个命令的输入。这样可以实现多个命令的组合和协作,从而更加灵活地完成复杂的任务。
- 环境变量(Environment Variable):Shell使用环境变量来存储系统级别的配置信息、用户配置和运行时参数。环境变量可以在命令中使用,并且可以通过设置和修改来影响Shell的行为和操作。
- 脚本(Script):Shell允许用户编写一系列命令的脚本文件,以便将一组命令作为一个单独的程序运行。脚本可以包含条件语句、循环、函数等控制结构,从而实现更加复杂的自动化任务。
- 快捷键(Shortcut):Shell提供了许多快捷键和命令行编辑功能,用于提高命令行操作的效率和便捷性。例如,可以使用上下箭头键来浏览历史命令,使用Tab键进行命令和文件名的自动补全,使用Ctrl+C来中断正在执行的命令等。
三、命令
1.自定义变量
#!/bin/bash
#这是脚本文件的shebang,它告诉系统脚本文件使用哪种解释器来执行。在这个例子中,使用的是bash解释器
#变量名=变量值(等号左右不能有空格),定义了两个变量page_size和page_num,并分别给它们赋值为1和2 page size=1 page_num=2
#将命令复制给变量,这样可以通过变量名来执行命令。
_ls=ls
#将命令结果赋值给变量,可以通过变量名来访问命令结果
file_list=$(ls -a)
#默认字符串,不会进行 + 运算。所以total的值为"page_size*page_num"字符串 total=page_size*page_num
#声明变量为整型(-i),后续的数值计算中,total会被当作整型来处理
let total=page_size*page_num declare -i total=page_size*page_num
#导出环境变量,使得其在子进程中也可用 export total declare -x total
2.环境变量
page_size=1
page_num=2
let total=page_size*page_num
# 使用 export 将变量变成环境变量
export total
# 也使用 -x 参数声明为环境变量
declare -x total
四、重定向
1.重定向符号
>: 覆盖写入文件>>: 追加写入文件2>: 错误输出写入文件, 2 表示标准错误,>相当于省略了前面的 1(标准输出)&>: 正确和错误输出统一写入到文件中
示例
# 测试 >
$ echo hello > a.txt
$ cat a.txt
hello
$ echo hi > a.txt
$ cat a.txt
hi
# 测试 >>
$ echo hello >> a.txt
$ cat a.txt
hi
hello
# 测试 2>>
linhieng@LINHIENG:~$ abcde >> a.txt
Command 'abcde' not found, but can be installed with:
sudo apt install abcde
linhieng@LINHIENG:~$ abcde 2>> a.txt
linhieng@LINHIENG:~$ cat a.txt
hi
hello
Command 'abcde' not found, but can be installed with:
sudo apt install abcde
# 测试 &>
$ abcde &> a.txt
$ cat a.txt
Command 'abcde' not found, but can be installed with:
sudo apt install abcde
五、模块化
>模块化的原理是在当前 shell 内执行函数文件, 具体是使用 `source 函数库路径` 来实现模块化。
六、执行过程和原理
执行过程
- 字符解析
- 识别换行符、 分号(
;) 做行的分割 - 识别命令连接符(
||&&|) 做命令的分割 - 识别空格、tab符, 做命令和参数的分割
- shell 展开, 例如
{1..3}解析为1 2 3 - 重定向, 将
stdin,stdout,stderr的文件描述符进行指向变更 - 执行命令
builtin直接执行- 非
builtin使用$PATH查找, 然后启动子进程执行
-
收集状态并且返回