42、Linux 脚本编写与编程入门

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
```
  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

  2. 添加第 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

  3. 完成处理

    • 使用 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 脚本编写和编程,开启你的开发之旅。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值