版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
09openEuler网络操作系统搭建、配置与管理第9章Shell程序编写教材配套·授课版课件openEuler24.03LTSKernel6.6本章内容导航1高级Shell编程2程序编译3实验项目:Shell编程4责任培养:网络安全防护与个人行动第9章Shell程序编写★重点知识地图openEuler24.03LTS·Kernel6.63/123本章知识地图:函数定义·函数调用·变量作用域·错误处理openEulerShell程序编写函数·GCC编译·静态/动态库·Makefile函数定义•[function]name(){...}•return返回整数值•basename/dirname路径处理•read交互式读取输入函数调用•函数名直接调用•$()子Shell捕获输出•位置参数$1$2$#•printf格式化输出变量作用域•local局部变量•export全局变量•set-u/-e防错选项•trap退出清理错误处理:set-u/-e/-opipefail·GCC编译·静态库/动态库·Makefile·实验项目:Shell编程➊gcc[options]filenames➋gcc-static-lxxx静态链接➌make/Makefile自动化构建第9章Shell程序编写★重点本章学习目标openEuler24.03LTS·Kernel6.64/123本章学习目标(4项)完成本章学习后,应掌握Shell函数的定义与调用,理解GCC编译及静态/动态库的使用,并能通过Makefile实现自动化构建。1.Shell函数定义functionname(){...}/name(){},使用return返回值。2.printf格式输出printf'format'var1var2...。3.read内置选项read-p/-e/-n/-t实现交互体验优化。4.set选项set#!/bin/bash+set+u/+opipefail防错增强。第9章Shell程序编写第9章Shell程序编写在实际工作环境中,可能需要在openEuler系统中进行软件开发抑或是编写一些更加复杂Shell脚本,那就需要进一步了解Shell脚本的一些高级用法和常用的编译器。本章主要介绍Shell函数的编写及常用编译器的使用。openEuler24.03LTS·Kernel6.65/123SECTION1高级Shell编程1高级Shell编程在开始编写较复杂的Shell脚本时,可能会在多个地方重复使用了部分执行特定任务的代码。这些代码有时很简单,如显示一条文本消息并从脚本用户那里获得答案;有时则比较复杂,需要作为大型处理过程的一部分被多次使用。在Shell脚本中多次重写一段代码那样效率有些低下。bashShell提供了这种功能。函数是一个脚本代码块,用户可以为其命名并在脚本中的任何位置调用它。每当需要在脚本中使用该代码块时,直接写函数名即可。openEuler24.03LTS·Kernel6.67/123用户自定义函数★(重点)用户自定义函数的语法如下。[function]name[()]{commands[returnint;]}name定义了该函数的唯一名称。脚本中的函数名不能重复。openEuler24.03LTS·Kernel6.68/123用户自定义函数★(重点)commands是组成函数的一个或多个bashShell命令。调用该函数时,bashShell会依次执行函数内的命令,就像在普通脚本中一样。方括号“[]”中的为可选选项,可以在函数名前面使用关键字function更加直观的表示这是一个函数。函数名后加上空括号表明正在定义的是一个函数。这种语法更接近其他编程语言中定义函数的方式。在脚本中使用函数,只需要直接写出函数名即可,如图9-1所示。openEuler24.03LTS·Kernel6.69/123图9-1调用函数openEuler24.03LTS·Kernel6.610/123用户自定义函数★(重点)图9-1调用函数每次调用函数时,bashShell会找到函数的定义并执行在其中定义的命令。默认情况下,习惯将函数定义放在Shell脚本的最开始部分,但这不是必须要求,不过需要注意的是:如果试图在函数被定义之前调用它,则会报错,如图9-2所示。openEuler24.03LTS·Kernel6.611/123图9-2调用函数错误示例openEuler24.03LTS·Kernel6.612/123用户自定义函数★(重点)图9-2调用函数错误示例如图9-2,脚本试图在f2函数被定义之前就调用该函数。由于f2函数此时尚未定义,因此在调用f2时,产生了一条错误消息。另外也要注意函数名必须是唯一的,否则在运行中会出现歧义。如果定义了同名函数,那么新定义就会覆盖函数原先的定义,如图9-3所示。openEuler24.03LTS·Kernel6.613/123图9-3函数覆盖示例openEuler24.03LTS·Kernel6.614/123用户自定义函数★(重点)图9-3函数覆盖示例可以发现f1函数重新定义后,后续的函数调用会使用第二个定义。和其他高级语言一样,Shell中的函数也是有返回值的,bashShell中可以使用return命令允许指定一个整数值作为函数的返回值,从而提供了一种简单的编程设定方式,如图9-4所示。openEuler24.03LTS·Kernel6.615/123图9-4设置函数返回值openEuler24.03LTS·Kernel6.616/123用户自定义函数★(重点)图9-4设置函数返回值不指定return的返回值时return默认返回0,表示成功,如图9-5所示。openEuler24.03LTS·Kernel6.617/123图9-5函数默认的返回值openEuler24.03LTS·Kernel6.618/123用户自定义函数★(重点)图9-5函数默认的返回值当然,也可以定义变量来接收函数的输出,如图9-6所示。openEuler24.03LTS·Kernel6.619/123图9-6接收函数输出openEuler24.03LTS·Kernel6.620/123用户自定义函数★(重点)图9-6接收函数输出这种方法还可以返回浮点值和字符串,如图9-7所示。openEuler24.03LTS·Kernel6.621/123图9-7返回字符串openEuler24.03LTS·Kernel6.622/123用户自定义函数★(重点)图9-7返回字符串在Shell脚本中,函数可以接收参数,这些参数的使用方式与脚本本身的参数类似,如图9-8所示。openEuler24.03LTS·Kernel6.623/123图9-8接收参数openEuler24.03LTS·Kernel6.624/123用户自定义函数★(重点)图9-8接收参数openEuler24.03LTS·Kernel6.625/123系统函数Shell编程和其它编程语言一样,有系统函数,即那些由Shell环境预定义的命令或功能,它们可以直接在脚本中使用。★(重点)这里介绍两个实用的系统函数:“basename”和“dirname”。•basenamebasename基本语法如下。basename[pathname][suffix]或者:basename[string][suffix]basename用于从完整的文件路径中提取文件名部分。它会去掉路径中的目录部分,只保留文件名或最后一级目录名,如图9-9所示。openEuler24.03LTS·Kernel6.626/123系统函数图9-9basename命令使用说明:basename命令会删掉所有的前缀包括最后一个“/”字符,然后将字符串显示出来。suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉,如图9-10所示(第二个参数是后缀)。openEuler24.03LTS·Kernel6.628/123系统函数图9-10basename命令去除后缀如果路径以斜杠/结尾,basename会返回最后一级目录名,如图9-11所示。openEuler24.03LTS·Kernel6.630/123系统函数图9-11返回最后一级目录名如果路径是一个纯目录路径,basename会返回最后一级目录名,如所图9-12所示。openEuler24.03LTS·Kernel6.632/123图9-12basename命令返回最后一级目录名openEuler24.03LTS·Kernel6.633/123系统函数图9-12basename命令返回最后一级目录名•dirnamedirname基本语法如下。dirnamepathnamedirname用于从完整的文件路径中提取目录部分。它会去掉路径中的文件名,只保留目录路径,如图9-13所示。openEuler24.03LTS·Kernel6.634/123系统函数图9-13提取目录部分dirname命令也适用于相对路径,如图9-14所示。openEuler24.03LTS·Kernel6.636/123图9-14提取相对路径示例openEuler24.03LTS·Kernel6.637/123系统函数图9-14提取相对路径示例openEuler24.03LTS·Kernel6.638/123获取用户输入尽管命令行选项和参数是从脚本用户处获取输入的一种重要方式,但有时候需要脚本有更多的交互性。如想要在脚本运行时询问用户并等待用户回答。为此,bashShell提供了read命令。read的基本语法如下。read(选项)(参数)read命令用于与控制台输入交互或从另一个文件描述符中接受输入。获取输入后,read命令会将数据存入变量,如图9-15所示。openEuler24.03LTS·Kernel6.639/123图9-15使用read获取输入openEuler24.03LTS·Kernel6.640/123获取用户输入图9-15使用read获取输入在read命令后使用-p选项可以指定读取值时的提示符,如图9-16所示。openEuler24.03LTS·Kernel6.641/123图9-16指定提示符openEuler24.03LTS·Kernel6.642/123获取用户输入图9-16指定提示符需要注意的是,如果指定一个变量作为接收read的输入,则输入的内容均保存在该变量中,如果指定多个变量接受输入,则输入的每个数据会依次赋给每个变量,若最后变量不足则余下所有内容赋给最后一个变量,如图9-17、图9-18所示。openEuler24.03LTS·Kernel6.643/123图9-17指定多个变量openEuler24.03LTS·Kernel6.644/123获取用户输入图9-17指定多个变量openEuler24.03LTS·Kernel6.645/123图9-18变量数小于输入数据数openEuler24.03LTS·Kernel6.646/123获取用户输入图9-18变量数小于输入数据数使用read获取输入时,如果不指定变量则输入的数据会存到REPLY环境变量中,如图9-19所示。openEuler24.03LTS·Kernel6.647/123图9-19保存获取的数据openEuler24.03LTS·Kernel6.648/123获取用户输入图9-19保存获取的数据在read命令中使用-t选项指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待,如图9-20所示。openEuler24.03LTS·Kernel6.649/123图9-20设置等待时间openEuler24.03LTS·Kernel6.650/123获取用户输入图9-20设置等待时间也可以使用read命令读取文件。read命令每次都会从指定文件中读取一行文本,当文件读取完后自动退出,如图9-21所示。openEuler24.03LTS·Kernel6.651/123图9-21读取文件openEuler24.03LTS·Kernel6.652/123获取用户输入图9-21读取文件openEuler24.03LTS·Kernel6.653/123SECTION2程序编译2程序编译虽然openEuler支持多种编程语言,C语言仍是openEuler系统最主要的编程语言,它也是目前处理工程类问题最普适的编程语言。★(重点)在其内核中,除了极少量的初始代码是使用与处理器架构相关的汇编语言编写以外,其他的代码全部都是由C语言完成,应用软件也是以C语言为主。因此,本节重点围绕C语言编程问题展开。openEuler24.03LTS·Kernel6.655/123程序编译的基础知识高级语言需要通过专门的软件转换成机器语言,才能被计算机执行。这个转换软件统称编译工具。将高级语言编译成机器语言,大致需要经过预处理、编译、汇编和链接四个过程。预处理:完成将#include的文件嵌入、进行宏替换,及其他宏语句的处理。•编译:将预处理后生成的文件进行语法分析、翻译,转换成汇编语言。•如果有文件输出,生成后缀为“.s”的汇编语言件。•汇编:将汇编语言翻译成机器语言,生成目标文件,通常文件名后缀是“.o”。•目标文件中是可执行的代码,但不具备可执行文件的格式,因为操作系统不知道如何将它装人内存,也不知道如何给它分配地址。•链接:根据要求将若干目标文件组装在一起,指定正确的外部地址,再加上工具链中的启动文件,共同组合成一个可执行文件。通常情况下,程序编译不会保留中间生成的文件。需要注意的是,并非所有软件的开发过程都要经过上面四个步骤,例如,开发静态库只需要前三步,最后用库管理工具做个包装就行了;openEuler24.03LTS·Kernel6.656/123程序编译的基础知识如果本身就是汇编语言源程序,汇编转换工作则是不必要的。openEuler24.03LTS·Kernel6.657/123gcc简介GCC(GNUCompilerCollection,GNU编译器套件)是GNU推出的功能强大、性能优越的多平台编译器。GCC编译器能将C、C++语言源程序、汇编程序和目标程序编译、链接成可执行文件。openEuler操作系统中已默认安装了GCC软件包。可以通过如下命令检查系统中是否安装了默认的GCC编译器和GCC的版本。gcc--version如果系统中安装了GCC,该命令会输出GCC的版本信息。如果没有安装,会提示命令未找到,如图9-22所示。openEuler24.03LTS·Kernel6.658/123图9-22检查GCC版本openEuler24.03LTS·Kernel6.659/123gcc简介图9-22检查GCC版本GCC可以根据给定的输入文件,选择适合的编译方式,表9-1列出了常用的文件类型。★(重点)表9-1GCC常用文件类型openEuler24.03LTS·Kernel6.660/123使用gcc使用GCC将源代码文件生成可执行文件,需要经过预处理、编译、汇编和链接。•预处理:将源程序(如
.c
文件)预处理,生成
.i
文件。•编译:将预处理后的
.i
文件编译成为汇编语言,生成
.s
文件。•汇编:将汇编语言文件经过汇编,生成目标文件
.o
文件。•链接:将各个模块的
.o
文件链接起来生成一个可执行程序文件。其中
.i
文件、.s文件、.o文件是中间文件或临时文件,如果使用GCC一次性完成C语言程序的编译,则这些文件会被删除。GCC编译的命令格式如下。gcc
[options]filenames其中:options
是编译选项。filenames
是文件名称。GCC中常用的编译选项如表9-2所示。★(重点)openEuler24.03LTS·Kernel6.661/123使用gcc表9-2常用编译选项★(重点)使用GCC编译程序示例,如图9-23所示。openEuler24.03LTS·Kernel6.662/123图9-23编译程序示例openEuler24.03LTS·Kernel6.663/123使用gcc图9-23编译程序示例GCC还可以一次编译多个文件,如图9-24、图9-25所示。openEuler24.03LTS·Kernel6.664/123图9-24编译多个文件openEuler24.03LTS·Kernel6.665/123使用gcc图9-24编译多个文件openEuler24.03LTS·Kernel6.666/123使用gcc图9-25执行代码openEuler24.03LTS·Kernel6.668/123库库(Library)
是一种预编译的代码集合,用于在多个程序之间共享功能。库的主要目的是减少代码冗余,提高代码复用性,并简化程序的开发和维护。根据其使用方式和加载时机主要分为两大类:静态库(StaticLibraries)
和
动态库(DynamicLibraries)。•静态库静态库是一种在程序编译时链接到可执行文件中的库,通常以.a结尾(例如libm.a)。它们的代码会被直接嵌入到最终的可执行文件中,因此生成的程序是自包含的,不需要在运行时加载额外的库文件,避免了因运行时动态加载而导致开销增加,同时这也意味着编译程序后不需要外部函数库支持即可执行,可移植性好。缺点是可执行文件体积较大,因为库代码被嵌入到每个程序中,并且如果库代码更新,需要重新编译所有使用该库的程序。•动态库动态库(也称为共享库)是一种在程序运行时加载的库,通常以.so结尾(例如libm.so)。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,只有在程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。openEuler24.03LTS·Kernel6.669/123库由于函数库没有被整合进程序中,而是程序运行时动态的加载并调用,所以程序的运行环境中必须提供相应的库。动态库的改变并不会影响程序运行,所以动态库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。如果库代码更新,只需更新库文件,无须重新编译程序。但缺点是动态库的可执行文件必须依赖动态库的存在,这也导致其可移植性不如静态库。openEuler24.03LTS·Kernel6.670/123创建和使用动态链接库•准备相应操作的.c文件,然后将.c文件转换至汇编文件*.o文件,如图9-26所示。openEuler24.03LTS·Kernel6.671/123创建和使用动态链接库图9-26将.c文件转换至汇编文件*.o文件说明:-fPIC表示产生位置无关代码。★(重点)PIC:告诉编译器产生与位置无关代码(Position-IndependentCode),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。•创建并链接到动态库,如图9-27所示openEuler24.03LTS·Kernel6.673/123创建和使用动态链接库图9-27创建并链接到动态库说明:exportLD_LIBRARY_PATH=”.”。LD_LIBRARY_PATH是一个环境变是,告诉链接器库的搜索路径。这里将库的搜索路径设置成当前目录。如果不声明路径直接执行程序会报错:找不到文件路径。•将main.c和libhelp.so一起编译成a.out,如图9-28所示。openEuler24.03LTS·Kernel6.675/123创建和使用动态链接库图9-28文件编译当a.out运行时,会动态地加载链接库libhelp.so。openEuler24.03LTS·Kernel6.677/123创建和使用静态链接库•准备相应操作的.c文件,然后将c文件转换为汇编文件*.o文件,如图9-29所示。openEuler24.03LTS·Kernel6.678/123创建和使用静态链接库图9-29将c文件转换为汇编文件*.o文件•执行ar-crlibhelp.a*.o,如图9-30所示。openEuler24.03LTS·Kernel6.680/123创建和使用静态链接库图9-30执行ar-crlibhelp.a*.o说明:ar命令可以用来创建、修改库,也可以从库中提出单个模块。ar是archiver的缩写。ar命令的常用参数如下。•-r:将文件插入库文件中,如果已经存在会直接替换。•-t:显示库文件中所包含的.o文件。•-c:表示create,创建。★(重点)•help:表示库的名字。openEuler24.03LTS·Kernel6.682/123创建和使用静态链接库图9-31编译.c文件如图9-31所示,此时直接编译.c文件会报错,因为GCC的默认搜索路径是/lib和/usr/lib,而刚刚创建的静态库并不在默认搜索路径中,这时需要用到两个参数:“-L.”和“-l.”。•-L.:告知GCC链接库的存放路径,此时切记-L后面的“.”表示当前目录,这取决于用户前面生成的库放在哪里。★(重点)•如果用户把制作的库放在/lib、/usr/lib目录下,可以不需要该选项,因为这些是GCC的默认搜索路径。•-l.:告知GCC用户自定义头文件的存放路径。•“.”表示当前目录,这取决于用户的头文件放在哪里。•如果用户把制作的库放在/include、/usr/include等目录下,可以不需要该选项,这是GCC的默认搜索路径。•编译main.c文件,如图9-32所示。openEuler24.03LTS·Kernel6.684/123创建和使用静态链接库图9-32编译main.c文件注意:链接到静态库只需要写库名即可,不需要带上前缀和后缀。链接静态库的程序创建好之后,即便删去用到的静态链接库,对程序的执行也不会造成影响,如图9-33所示。openEuler24.03LTS·Kernel6.686/123创建和使用静态链接库图9-33链接静态库之后运行文件gcc编译时默认优先使用动态链接,即当同一目录下既有动态库又有静态库,并且两个库的名字相同时,优先使用动态库,如果要指定优先链接静态库,需要指定-static选项,命令如下。gccmain.c-L.-static-lxxx#xxx代表库名★(重点)在指定-static选项的情况下,如果libxxx.a和llibxxx.so同时存在,则会链接libxxx.a。openEuler24.03LTS·Kernel6.688/123make和makefile介绍GNUmake实用程序(通常缩写为make)是一种用于控制从源文件生成可执行文件的工具。make会自动确定复杂程序的哪些部分已更改并需要重新编译。make使用称为Makefiles的配置文件来控制程序的构建方式。makefile文件中常用的选项如xxx(这里交叉引用)所示。使用make由源代码文件生成可执行文件,需要经过如下步骤。•make命令会读入Makefile文件,包括当前目录下命名为"GNUmakefile"、"makefile"、"Makefile"的文件、被include的makefile文件、参数-f、--file、-makefile指定的规则文件。•初始化变量。•推导隐含规则,分析依赖关系,并创建依赖关系链。•根据依赖关系链,决定哪些目标需要重新生成。•执行生成命令,最终输出终极文件。make命令格式如下。openEuler24.03LTS·Kernel6.689/123make和makefile介绍make
[option][target]make命令常用的选项如表9-3所示。★(重点)表9-3make的常用选项openEuler24.03LTS·Kernel6.690/123使用makefile进行宏编译make是通过Makefile文件获取如何编译、链接和安装、清理的方法,从而实现将源代码文件生成可执行文件和其他相关文件的工具。因此,Makefile中描述了整个工程的编译和链接等规则,其中包含了哪些文件需要编译,哪些文件不需要编译,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重建等等。Makefile文件让工程编译实现了自动化,不需要每次都手动输入一堆源文件和参数。Makefile的文件结构如下所示:target:dependenciescommands说明如下。targets
:目标,可以是目标文件、可执行文件或标签。prerequisites
:依赖文件,生成targets需要的文件或者是目标。可以是多个,也可以没有。openEuler24.03LTS·Kernel6.691/123使用makefile进行宏编译command
:make需要执行的命令(任意的Shell命令)。可以有多条命令,每一条命令占一行。目标和依赖文件之间要使用“:”分隔,命令行必须以Tab而非空格开头。使用实例如下。•首先准备好需要编译的文件,如图9-34所示。openEuler24.03LTS·Kernel6.692/123图9-34准备好需要编译的文件openEuler24.03LTS·Kernel6.693/123使用makefile进行宏编译图9-34准备好需要编译的文件•然后创建Makefile文件,如图9-35所示。openEuler24.03LTS·Kernel6.694/123图9-35创建Makefile文件openEuler24.03LTS·Kernel6.695/123使用makefile进行宏编译图9-35创建Makefile文件•执行make命令,如图9-36所示。openEuler24.03LTS·Kernel6.696/123使用makefile进行宏编译图9-36执行make命令说明:执行时会打印Makefile中执行的命令。如果不需要打印该信息,可以在执行make命令时加上参数-s。•执行完毕后即可直接运行得到的程序,如图9-37所示。openEuler24.03LTS·Kernel6.698/123SECTION3实验项目:Shell编程3实验项目:Shell编程•实验目的掌握Shell编程中条件语句、循环语句的使用方法。•实验步骤•创建一个新文件lab.sh,向文件中写入如下代码并保存。•该脚本用于把/var/log目录里最近7天内被修改过的所有普通文件列出来,统计它们按扩展名的出现次数,并把结果写进当前目录下的snapshot.txt。#!/bin/bashSRC=/var/log#指定扫描目录AGE=7#指定天数阈值OUT=./snapshot.txt#指定输出文件openEuler24.03LTS·Kernel6.6102/123实验项目:Shell编程#1.目录检查if[!-d"$SRC"];thenecho"目录不存在"exit1fi#2.准备临时文件TMP=./tmp_snapopenEuler24.03LTS·Kernel6.6103/123实验项目:Shell编程mkdir"$TMP"LIST=$TMP/listEXTS=$TMP/exts#3.扫描最近7天文件find"$SRC"-typef-mtime-"$AGE">"$LIST"#4.统计文件总数(手算)TOTAL=0whileread_;openEuler24.03LTS·Kernel6.6104/123实验项目:Shell编程doTOTAL=$((TOTAL+1))done<"$LIST"#5.提取扩展名并计数:>"$EXTS"whileread-rf;doEXT=${f##*.}openEuler24.03LTS·Kernel6.6105/123实验项目:Shell编程["$EXT"="${f##*/}"]&&EXT="noext"echo"$EXT">>"$EXTS"done<"$LIST"#6.输出echo"=====最近7天文件快照=====">"$OUT"echo"目录:$SRC">>"$OUT"echo"文件总数:$TOTAL">>"$OUT"echo"">>"$OUT"openEuler24.03LTS·Kernel6.6106/123实验项目:Shell编程echo"=====按扩展名=====">>"$OUT"#计数sort"$EXTS">"$EXTS.s"PREV=""CNT=0whileread-rEXT;doif["$EXT"!="$PREV"];openEuler24.03LTS·Kernel6.6107/123实验项目:Shell编程then[-n"$PREV"]&&printf"%-8s%s""$PREV""$CNT">>"$OUT"PREV="$EXT"CNT=1elseCNT=$((CNT+1))fidone<"$EXTS.s"openEuler24.03LTS·Kernel6.6108/123实验项目:Shell编程[-n"$PREV"]&&printf"%-8s%s""$PREV""$CNT">>"$OUT"echo"">>"$OUT"echo"=====文件路径=====">>"$OUT"cat"$LIST">>"$OUT"rm-rf"$TMP"echo"结果已保存在$OUT"•为文件添加执行权限。chmodu+xlab.sh•脚本执行后可以在当前目录下的snapshot.txt文件查看结果。openEuler24.03LTS·Kernel6.6109/123实验项目:Shell编程•如图9-38所示。openEuler24.03LTS·Kernel6.6110/123图9-38脚本执行结果openEuler24.03LTS·Kernel6.6111/123实验项目:Shell编程图9-38脚本执行结果openEuler24.03LTS·Kernel6.6112/123SECTION4责任培养:网络安全防护与个人行动4责任培养:网络安全防护与个人行动在信息技术飞速发展的今天,掌握GCC编译程序、库的使用及make和makefile等构建工具,对于计算机专业学生而言,不仅是专业技能的提升,更是对严谨求实、探索创新精神的践行。然而,在追求技术进步的同时,不能忽视网络空间中潜在的威胁与挑战,特别是网络安全问题,它直接关系到个人隐私、企业安全乃至国家安全。★(重点)因此,将网络安全防护意识融入思政教育,引导学生树立正确的网络安全观,是新时代思政教育不可或缺的一部分。网络安全防护不仅是一项技术任务,更是一种社会责任。在思政教育中,应强调以下几点:一、增强网络安全意识。通过案例分析、专家讲座等形式,让学生深刻认识到网络安全的重要性,了解网络攻击的常见手段及危害,提高防范意识和自我保护能力。二、培养合法合规的网络行为。教育学生遵守国家法律法规,不参与网络攻击、传播恶意软件等违法行为,维护网络空间的清朗和秩序。三、提升技术防范能力。openEuler24.03LTS·Kernel6.6114/123责任培养:网络安全防护与个人行动结合专业学习,鼓励学生掌握网络安全相关知识和技能,如加密技术、防火墙配置等,为个人信息和企业数据提供坚实的技术保障。★(重点)四、倡导积极健康的网络文化。引导学生树立正确的网络价值观,积极参与网络公益活动,传播正能量,共同营造风清气正的网络环境。作为计算机专业的学生,更应将网络安全防护视为己任,将所学知识与实际行动相结合,为构建安全可信的网络空间贡献自己的力量。同时,也应成为网络安全的宣传者和推动者,通过努力和行动,影响和带动更多的人关注网络安全问题,共同守护和谐的网络家园。openEuler24.03LTS·Kernel6.6115/123第9章Shell程序编写★重点本章小结openEuler24.03LTS·Kernel6.6116/123本章小结·核心知识回顾本章主要介绍了Shell脚本的高级编程技巧及常用编译器的使用方法,同时还介绍了静态库和动态库的构建与使用。通过本章的学习,读者应掌握Shell脚本中函数的定义与使用方法,理解C语言编译过程及GCC的常用选项,熟悉静态库和动态库的创建与使用,并能够通过Makefile实现项目的自动化构建。这些知识将为在openEuler系统中进行高效开发提供坚实基础。①函数定义func(){...}func调用/$()子Shell调用②参数传递$1/$2位置参数$#总参个数${0}脚本名③变量作用域local局部vs全局(export)④set选项集set-u未定义报错+set-e立即退出⑤错误处理set-opipefailtrap'cleanup'EXIT第9章Shell程序编写★重点本章小结openEuler24.03LTS·Kernel6.6117/123本章小结·重点命令速查表分类命令作用/说明函数定义[function]name(){commands[returnint;]}定义函数(可返回整数值)basenamebasename[pathname][suffix]提取文件名/去除后缀dirnamedirnamepathname提取路径的目录部分readread(选项)(参数)读取用户输入GCC版本gcc--version查看GCC版本GCC编译gcc[options]filenames编译C语言程序静态链接gccmain.c-L.-static-lxxx链接静态库(-l指定库名)makemake[option][target]按Makefile执行构建Makefiletarget:dependencies+Tab命令目标:依赖+命令规则执行权限chmodu+xlab.sh为脚本添加执行权限第9章Shell程序编写★重点本章小结openEuler24.03LTS·Kernel6.6118/123本章小结·学习建议(5条)1.掌握函数定义函数定义、return返回值与$1/$2位置参数的传递。2.熟练read/printfread-p/-t交互输入、printf格式化输出提升脚本体验。3.理解GCC编译gcc[options]filenames及.i/.s/.o中间文件的生成过程。4.会用静态/动态库ar创建静态库、-l链接、ldd查看动态库依赖。5.掌握Makefiletarget:dependencies+Tab命令规则,make实现自动化构建。练习题练习题一、选择题•以下关于Shell函数返回值的说法,错误的是(
)A.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年健康信息管理伦理与法律法规课件
- 河南事业编社会工作岗 模拟预测试卷 含答案解析
- 2026年大连星海会展旅游集团有限公司人员招聘笔试参考试题及答案详解
- 2026年中国铁道建筑集团有限公司人员招聘笔试参考试题及答案详解
- 2026年宝鸡石油机械有限责任公司人员招聘参考题库及答案详解
- 2026年重庆机电控股集团公司人员招聘考试题库及答案详解
- 2026年天津津融投资服务集团有限公司人员招聘参考题库及答案详解
- 2026济南泉商调解中心公开招聘司法助理笔试备考题库及答案解析
- 2026年齐鲁股权交易中心有限公司人员招聘考试参考试题及答案详解
- 2026年重庆化医控股集团公司人员招聘考试备考试题及答案详解
- 服装设计师作品组绩效衡量表
- 河南省部分高中2026-2027学年高二上学期9月联考数学试卷(含答案)
- 2025“外研社国才杯”“理解当代中国”外语能力综合能力赛项(英语组)模拟样卷
- 2026年河北高考历史真题(试卷+解析)
- 人教版2026-2027学年高中物理必修第三册第9章-13章期中测试卷(含解析)
- 2026畜禽种业自主创新与核心种群建设战略研究报告
- 2026年企业合规师初级题库及答案
- 2026年陕西事业编考试综合管理模拟题及答案
- 2026年武汉市中考语文试卷(含答案)
- 陕西科技大学教师专业技术职务评审工作实施办法(试行)
- 高中历史课件-第6课-全球航路的开辟
评论
0/150
提交评论