Linux 脚本编写与编程入门
1. 使用 awk 和 sed 处理书籍数据库
在处理书籍数据库时,我们可能会遇到需要更新国际标准书号(ISBN)的情况。以前,ISBN 是 10 位数字,现在新书的 ISBN 是 13 位数字。为了使数据库符合当前标准,我们需要为每个条目添加一个新的字段,即 ISBN - 13 号。
1.1 计算 ISBN - 13 号
要计算现有数据库条目的 ISBN - 13 号,我们从 978 开始,然后使用旧 ISBN 的前 9 位数字。第 13 位数字是通过以下数学计算得到的校验位:
1. 将所有奇数位数字相加(第 1、3、5 位等)。
2. 将所有偶数位数字乘以 3 后相加。
3. 将步骤 2 的总和与步骤 1 的总和相加。
4. 找出需要添加多少才能将该数字四舍五入到最接近的 10。这个值就是第 13 位数字。
例如,对于 10 位 ISBN 0743477103:
1. 奇数位数字相加:9 + 8 + 7 + 3 + 7 + 1 = 35。
2. 偶数位数字乘以 3 后相加:7 * 3 = 21;0 * 3 = 0;4 * 3 = 12;4 * 3 = 12;7 * 3 = 21;0 * 3 = 0;21 + 0 + 12 + 12 + 21 + 0 = 66。
3. 总和相加:66 + 35 = 101。
4. 四舍五入到最接近的 10:110 - 101 = 9。
因此,ISBN - 13 变为 9780743477109。
1.2 处理数据库的步骤
以下是更新数据库的具体步骤:
1.
提取 ISBN
:
- 使用
cut
工具提取每行的前 9 个字符:
cut -c1 - 9 books
。
- 使用
sed
在每个数字之间添加空格:
sed 's/[0 - 9]/& /g'
。
- 使用
sed
在每行开头添加 978:
sed 's/^/9 7 8 /'
。
- 使用
sed
去除行尾的空格:
sed 's/ $//'
。
- 将结果写入临时文件
isbn2
:
cut -c1 - 9 books | sed 's/[0 - 9]/& /g' | sed 's/^/9 7 8 /' | sed 's/ $//' > isbn2
。
临时文件 `isbn2` 的内容如下:
```
9 7 8 0 7 4 3 4 7 7 1 0
9 7 8 1 5 7 8 5 1 8 5 2
9 7 8 0 3 2 1 3 4 9 9 4
9 7 8 1 5 8 7 0 5 2 4 1
```
-
计算第 13 位数字 :
-
使用
awk计算奇数位和偶数位数字的总和,并计算余数:
bash awk '{ x=$1+$3+$5+$7+$9+$11 ; y=$2+$4+$6+$8+$10+$12 ; y=y*3 ; x=x+y ; y=x%10 ; print y }' -
使用
sed进行转换:sed 'y/12346789/98764321/'。 -
将两个操作组合并将结果写入临时文件
isbn3:
bash awk '{ x=$1+$3+$5+$7+$9+$11 ; y=$2+$4+$6+$8+$10+$12 ; y=y*3 ; x=x+y ; y=x%10 ; print y }' | sed 'y/12346789/98764321/' > isbn3
临时文件
isbn3的内容如下:
9 4 1 5 -
使用
-
添加第 13 位数字到其他 12 位数字 :
-
使用
paste工具将两个临时文件合并:paste -d" " isbn2 isbn3。 -
使用
sed去除空格:sed 's/ //g'。 -
在每行开头添加冒号:
sed 's/^/:/'。 -
将结果写入临时文件
isbn4:paste -d" " isbn2 isbn3 | sed 's/ //g' | sed 's/^/:/' > isbn4。
临时文件
isbn4的内容如下:
:9780743477109 :9781578518524 :9780321349941 :9781587052415 -
使用
-
完成处理 :
-
使用
paste将临时文件的内容追加到当前数据库:paste books isbn4。 -
使用
sed去除制表符:sed 's/\t//g'。 -
将结果写入新文件
newbooks:paste books isbn4 | sed 's/\t//g' > newbooks。
最终文件
newbooks的内容如下:
0743477103:Macbeth:Shakespeare, William:9780743477109 1578518520:The Innovator's Solution:Christensen, Clayton M.:9781578518524 0321349946:(SCTS) Symantec Certified Technical Specialist:Alston, Nik:9780321349941 1587052415:Cisco Network Admission Control, Volume I:Helfrich, Denise:9781587052415 -
使用
2. 关于 Shell 脚本编写的最终提示
-
自动化运行
:创建脚本后,可以使用
at一次性运行,或使用cron定期运行。 -
条件表达式
:可以使用
if、while和until等条件表达式来监测事件的发生,或在某些内容消失时得到通知。 - 权限设置 :可以像设置其他文件的权限一样设置 Shell 脚本的权限,例如创建可供管理组成员共享的脚本。
3. Linux 编程概述
Linux 预装了开发软件所需的所有工具,通常只需安装它们即可。Linux 拥有所有 GNU 软件开发工具,如 GCC(C 和 C++ 编译器)、GNU make 和 GNU 调试器。
3.1 编程基础
计算机程序是执行特定任务的指令序列。对于大多数编程语言,创建计算机程序通常需要以下步骤:
1. 使用文本编辑器输入编程语言的命令序列,这就是源文件或源代码。要始终将源代码保存为纯文本。
2. 使用编译器将源文件从人类可读形式转换为机器可读的目标代码,通常还会将多个目标代码文件合并为一个可运行的计算机程序。
3. 使用调试器跟踪错误并找出源文件中可能导致错误的行。
4. 返回步骤 1,使用文本编辑器纠正错误,然后重复其余步骤。
这些步骤被称为编程的编辑 - 编译 - 调试循环,因为大多数程序员在程序正确运行之前需要多次重复这个序列。
3.2 编程术语和概念
- 变量 :用于存储不同类型的数据,就像有名称和存储空间的邮箱。
- 表达式 :通过数学运算符或文本操作函数组合变量。
- 语句 :执行某些操作,如为变量赋值或打印字符串。
-
流控制语句
:根据表达式的值允许语句以不同顺序执行,通常包括
for、do - while、while和if - then - else语句。 - 函数 :将多个语句分组并命名,可以通过调用函数多次执行相同的语句集。编程语言通常提供许多预定义函数,也可以创建自己的函数。
4. Linux 中的软件开发工具
Linux 支持以下传统 Unix 软件开发工具:
| 工具名称 | 作用 |
| ---- | ---- |
| 文本编辑器(如 vi 和 emacs) | 编辑源代码 |
| GNU C 和 C++ 编译器(GCC) | 编译和链接 C 和 C++ 程序 |
| GNU make 工具 | 自动化软件构建过程 |
| GNU 调试器(gdb) | 调试程序 |
| 版本控制系统(如 Git) | 跟踪源文件的各种修订版本 |
可以在任何 Linux 发行版中安装这些软件开发工具。在某些发行版中,这些工具默认安装。如果没有安装,可以通过命令行或图形界面进行安装。
5. GNU C 和 C++ 编译器
GCC 是 Linux 中最重要的软件开发工具,它可以编译三种语言:C、C++ 和 Objective - C。使用相同的
gcc
命令编译和链接 C 和 C++ 源文件,并且支持 ANSI 标准 C,便于将任何 ANSI C 程序移植到 Linux。
5.1 使用 GCC
使用
gcc
命令调用 GCC。默认情况下,对源文件使用
gcc
命令时,GCC 会进行预处理、编译和链接以创建可执行文件。可以使用 GCC 选项在中间阶段停止该过程,例如使用
-c
选项编译源文件并生成目标文件,但不进行链接步骤。
例如,编译和链接由两个源文件组成的简单程序:
-
area.c
文件内容:
#include <stdio.h>
#include <stdlib.h>
/* Function prototype */
double area_of_circle(double r);
int main(int argc, char **argv)
{
if(argc < 2)
{
printf("Usage: %s radius\n", argv[0]);
exit(1);
}
else
{
double radius = atof(argv[1]);
double area = area_of_circle(radius);
printf("Area of circle with radius %f = %f\n",
radius, area);
}
return 0;
}
-
circle.c文件内容:
#include <math.h>
#define SQUARE(x) ((x)*(x))
double area_of_circle(double r)
{
return M_PI * SQUARE(r);
}
编译和链接这两个文件以创建名为
area
的可执行文件:
gcc -o area area.c circle.c
如果有多个源文件需要编译和链接,可以分别编译每个源文件生成目标文件,然后再进行链接:
gcc -c area.c
gcc -c circle.c
gcc -o area area.o circle.o
编译完成后,可以从命令行运行
area
程序:
rich@Ubuntu22:~$ ./area 5
Area of circle with radius 5.000000 = 78.539816
rich@Ubuntu22:~$
5.2 编译 C++ 程序
GCC 也可以编译 C++ 源文件,它通过文件扩展名来确定文件是 C 还是 C++。C 文件的扩展名是小写的
.c
,而 C++ 文件以
.C
或
.cpp
结尾。
虽然
gcc
命令可以编译 C++ 文件,但它不会自动链接 C++ 程序通常需要的各种类库。使用
g++
命令编译和链接 C++ 程序很方便,因为它会以适当的选项运行
gcc
。不过,在某些发行版(如 Ubuntu)中,需要单独安装
g++
包。
例如,编译以下简单的 C++ 程序:
#include <iostream>
int main()
{
using namespace std;
cout << "Hello! This is Linux!" << endl;
}
总之,通过掌握这些脚本编写和编程的基础知识,我们可以更加高效地在 Linux 系统上进行开发工作。无论是处理数据库还是编写复杂的程序,Linux 都提供了丰富的工具和资源。
Linux 脚本编写与编程入门
6. 软件构建自动化:GNU make 工具
GNU make 工具在 Linux 软件开发中扮演着重要角色,它能够自动化软件的构建过程,将多个目标模块组合成可执行文件或库。
6.1 make 的基本原理
make 工具通过读取一个名为
Makefile
的文件来工作。
Makefile
中包含了一系列规则,这些规则定义了如何从源文件生成目标文件,以及如何将目标文件链接成可执行文件。
例如,对于前面提到的计算圆面积的程序,其
Makefile
可以如下编写:
area: area.o circle.o
gcc -o area area.o circle.o
area.o: area.c
gcc -c area.c
circle.o: circle.c
gcc -c circle.c
clean:
rm -f area area.o circle.o
在这个
Makefile
中:
- 第一行定义了目标
area
,它依赖于
area.o
和
circle.o
这两个目标文件。当执行
make area
时,会根据规则执行
gcc -o area area.o circle.o
来生成可执行文件
area
。
- 接下来的两行分别定义了
area.o
和
circle.o
的生成规则,使用
gcc -c
命令将对应的源文件编译成目标文件。
- 最后一行的
clean
规则用于清理生成的文件,执行
make clean
会删除
area
、
area.o
和
circle.o
文件。
6.2 使用 make
在终端中,只需进入包含
Makefile
的目录,然后输入
make
命令,make 工具会根据
Makefile
中的规则自动完成编译和链接过程。如果只想编译某个目标文件,可以指定目标名称,如
make area.o
。
7. 调试程序:GNU 调试器 gdb
在软件开发过程中,调试是必不可少的环节。Linux 发行版通常包含 GNU 调试器 gdb,它可以帮助我们找出程序中的错误。
7.1 准备调试
在编译源文件时,需要使用
-g
选项来包含调试信息。例如,对于前面的
area.c
和
circle.c
文件,编译命令如下:
gcc -g -c area.c
gcc -g -c circle.c
gcc -g -o area area.o circle.o
7.2 使用 gdb 调试
在终端中输入
gdb area
进入 gdb 调试环境。以下是一些常用的 gdb 命令:
-
l
(list):列出源代码。
-
b
(break):设置断点,如
b main
会在
main
函数处设置断点。
-
r
(run):运行程序,程序会在断点处停止。
-
n
(next):单步执行下一行代码。
-
s
(step):进入函数内部执行。
-
c
(continue):继续执行程序直到下一个断点。
-
q
(quit):退出 gdb 调试环境。
例如,我们可以在
main
函数处设置断点,然后运行程序:
(gdb) b main
(gdb) r
程序会在
main
函数处停止,此时我们可以使用
n
或
s
命令逐步执行代码,检查变量的值,找出可能存在的错误。
8. 版本控制:Git
在软件开发中,版本控制是非常重要的,它可以帮助我们跟踪源文件的各种修订版本。Git 是 Linux 世界中迅速成为事实上标准的版本控制系统。
8.1 Git 的基本操作
-
初始化仓库
:在项目目录下执行
git init命令,将该目录初始化为一个 Git 仓库。 -
添加文件
:使用
git add命令将文件添加到暂存区,如git add area.c circle.c。 -
提交更改
:使用
git commit命令将暂存区的更改提交到本地仓库,如git commit -m "Initial commit"。 -
查看状态
:使用
git status命令查看文件的状态,了解哪些文件被修改、添加或删除。 -
查看日志
:使用
git log命令查看提交历史。
8.2 远程仓库
Git 还支持与远程仓库进行交互,常见的远程仓库托管平台有 GitHub、GitLab 等。以下是与远程仓库交互的基本操作:
-
添加远程仓库
:使用
git remote add origin <远程仓库地址>
命令添加远程仓库。
-
推送更改
:使用
git push -u origin main
命令将本地仓库的更改推送到远程仓库。
-
拉取更改
:使用
git pull origin main
命令从远程仓库拉取最新的更改。
9. GNU 通用公共许可证(GPL)的影响
在使用 GNU 工具和 GNU 库开发 Linux 软件时,需要了解自由软件基金会的 GNU 通用公共许可证(GPL)。GPL 旨在确保软件的自由使用、分发和修改。
9.1 GPL 的基本要求
- 自由使用 :用户可以自由地使用软件。
- 自由分发 :用户可以将软件分发给他人。
- 自由修改 :用户可以修改软件的源代码。
- 开源要求 :如果分发修改后的软件,必须公开修改后的源代码。
9.2 对开发的影响
在开发 Linux 软件时,如果使用了 GNU 工具和库,那么开发的软件可能需要遵循 GPL 许可证。这意味着软件的源代码需要公开,并且其他开发者可以自由使用、修改和分发。
10. 总结与展望
通过本文的介绍,我们了解了在 Linux 环境下进行脚本编写和编程的基础知识,包括使用 awk 和 sed 处理数据库、Shell 脚本编写的技巧、GCC 编译器的使用、GNU make 工具的自动化构建、gdb 调试器的调试方法、Git 版本控制系统的使用以及 GPL 许可证的影响。
在未来的开发中,我们可以进一步深入学习这些工具和技术,提高开发效率和软件质量。例如,学习更高级的 awk 和 sed 脚本编写技巧,掌握复杂的 C 和 C++ 编程技术,使用 Git 进行团队协作开发等。同时,我们也应该关注开源社区的发展,积极参与开源项目,为开源软件的发展做出贡献。
总之,Linux 提供了丰富的开发资源和工具,只要我们不断学习和实践,就能够在 Linux 平台上开发出高质量的软件。
以下是一个简单的流程图,展示了编程的基本流程:
graph TD;
A[编写源代码] --> B[编译源代码];
B --> C[调试程序];
C --> D{是否有错误};
D -- 是 --> A;
D -- 否 --> E[发布程序];
通过这个流程图,我们可以清晰地看到编程的编辑 - 编译 - 调试循环,以及最终发布程序的过程。希望本文能够帮助你快速入门 Linux 脚本编写和编程,开启你的开发之旅。
超级会员免费看
33万+

被折叠的 条评论
为什么被折叠?



