版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
08openEuler网络操作系统搭建、配置与管理第8章Shellscript基本知识与语法教材配套·授课版课件openEuler24.03LTSKernel6.6本章内容导航1Shellscript相关知识2Shellscript的编程语法3实验项目:Shell编程4责任培养:技术创新与知识产权保护第8章Shellscript基本知识与语法★重点知识地图openEuler24.03LTS·Kernel6.63/115本章知识地图:shebang#!·脚本格式·变量/条件循环·测试命令openEulerShell脚本基础#!/bin/bash解释器·脚本执行方式shebang#!•#!/bin/bash指定解释器•#!/bin/sh可移植写法•chmodu+x赋予执行权限•PATH环境变量引用脚本格式•变量名=值(无空格)•export导出环境变量•位置参数$1$*$@$#•预定义变量$$$!$?变量/条件循环•if/elif/else判断•case...esac多分支•for/while/until循环•while:无限循环测试命令:test/[]/[[]]/&&||·实验项目:Shell编程·责任培养:技术创新与知识产权保护➊testcondition判断➋[条件]与[[条件]]➌[c1]&&[c2]逻辑组合第8章Shellscript基本知识与语法★重点本章学习目标openEuler24.03LTS·Kernel6.64/115本章学习目标(4项)完成本章学习后,应掌握Shell脚本的编写方法,能够利用其自动化执行任务,提高工作效率。1.Shebang行第一行shebang(#!)指定解释器路径。2.bash变量规则变量名=值(无空格),环境变量用export。3.流程控制if/else/fi、for/do/done、while/do/done。4.read命令交互式读取用户输入。第8章Shellscript基本知识与语法第8章Shellscript基本知识与语法在上一章中讲解了如何使用Shell的命令行界面提示符来输入命令并查看命令结果。但是这也存在一个问题,如果所有的重复操作都要通过管理员手动执行,那样的话效率就过于低下了,而Shell脚本可以很好的解决这个问题。★(重点)Shell脚本的能够输人多个命令并处理每个命令的结果,甚至是将一个命令的结果传给另一个命令。很多系统维护、自动化处理方面的任务还是通过Shell脚本来完成更加高效。前面已经讲过了Shell的基本知识与命令,是时候动手编程了。本章将讨论Shell脚本的编程基础。openEuler24.03LTS·Kernel6.65/115SECTION1Shellscript相关知识1Shellscript简介Shell最早起源于Unix系统。在20世纪70年代,Unix操作系统在贝尔实验室诞生,它为多用户、多任务的操作系统奠定了基础。当时的Unix系统提供了简单的命令行界面,用户可以通过输入命令来与系统交互。这些命令被组织成脚本文件,从而实现批量执行操作,这便是Shell脚本的雏形。随着时间的推移,Shell不断发展并出现了多种版本。其中最著名的是BourneShell(sh),由StephenBourne在1977年开发。BourneShell引入了许多重要的特性,如条件语句、循环控制结构等,使得Shell脚本的编写更加灵活和强大。此后,CShell(csh)和BourneAgainShell(bash)等Shell相继出现。Bash由BrianFox在1989年开发,它兼容BourneShell,并且增加了许多新的功能,如命令行编辑、历史命令等功能,成为了目前最广泛使用的Shell之一。在计算机科学中,由可读性文本组成的具有程序性质的文件称为脚本(script)。脚本程序一词用于区别需要编译执行的二进制程序,它以脚本语言为基础。openEuler24.03LTS·Kernel6.67/115Shellscript简介而遵循Shell语法构成的文件被叫作Shell脚本程序。Shell脚本的主要功能是自动化执行一系列命令。通过编写脚本,用户可以将复杂的操作分解为简单的步骤,并且可以重复执行这些步骤,大大提高了工作效率。例如,系统管理员可以编写Shell脚本来定期备份数据、监控系统资源、管理用户账户等。此外,Shell脚本还可以用于软件安装、配置管理、网络管理等各个方面。随着技术的发展,Shell脚本也在不断地进化。现代的Shell脚本不仅支持基本的命令执行,还能够与各种编程语言和工具进行交互,如Python、Perl、awk等。此外,随着云计算和大数据技术的兴起,Shell脚本在自动化部署、集群管理等方面也发挥着越来越重要的作用。openEuler24.03LTS·Kernel6.68/115Shellscript的基本语法要将Shell命令放到文本文件中,首先要用文本编辑器创建一个文件,然后在其中输入命令。在创建Shell脚本文件时,必须在文件的第一行指定要使用的Shell,格式如下:#!/bin/bash在普通的Shell脚本中,#用作注释行。和高级语言类似,Shell并不会处理Shell脚本中的注释行。然而,Shell脚本文件的第一行是个例外,#后面的感叹号会告诉Shell用哪个Shell来运行脚本。(openEuler默认使用bashShell)当然,这里使用的Shell并不严格要求和系统默认Shell一样,这意味着,用户可以在脚本中使用另一个Shell来运行,只需要在脚本第一行声明使用的是什么Shell即可。在指明了Shell之后,可以在文件的各行输入命令,每行末尾加一个换行符。如图8-1所示。openEuler24.03LTS·Kernel6.69/115Shellscript的基本语法图8-1Shell脚本的基本格式以上是脚本的基本格式,但这个时候的脚本文件并不能直接运行,还需要赋予它执行权限。如所示。openEuler24.03LTS·Kernel6.611/115Shellscript的基本语法图8-2赋予脚本执行权限要让Shell找到刚刚编写的脚本,可以采用以下几种方法。•将放置Shell脚本文件的目录添加到PATH环境变量中。Shell维护着一组用于记录特定的系统信息的环境变量,如系统名称、已登录系统的用户名、用户的系统ID(也称为UID)、用户的默认主目录及Shell查找程序的搜索路径。用户可以将Shell脚本文件的路径加入到环境变量中,运行Shell脚本,如图8-3~图8-5所示。openEuler24.03LTS·Kernel6.613/115图8-3PATH环境变量openEuler24.03LTS·Kernel6.614/115Shellscript的基本语法图8-3PATH环境变量openEuler24.03LTS·Kernel6.615/115图8-4刷新配置openEuler24.03LTS·Kernel6.616/115Shellscript的基本语法图8-4刷新配置openEuler24.03LTS·Kernel6.617/115图8-5运行脚本openEuler24.03LTS·Kernel6.618/115Shellscript的基本语法图8-5运行脚本•在命令行中使用绝对路径或相对路径来引用Shell脚本文件。•如图8-6、图8-7所示。openEuler24.03LTS·Kernel6.619/115图8-6相对路径引用openEuler24.03LTS·Kernel6.620/115Shellscript的基本语法图8-6相对路径引用openEuler24.03LTS·Kernel6.621/115图8-7绝对路径引用openEuler24.03LTS·Kernel6.622/115Shellscript的基本语法图8-7绝对路径引用•使用sh+脚本的方式,如图8-8所示。说明:这种方式不用赋予脚本执行权限,直接执行即可。openEuler24.03LTS·Kernel6.623/115图8-8sh方式执行脚本openEuler24.03LTS·Kernel6.624/115Shellscript的基本语法图8-8sh方式执行脚本Shell脚本程序习惯以.sh后缀命名,值得一提的是,在openEuler和其他Linux发行版中,对于脚本文件的后缀名没有明确的要求,只要求文件内容满足脚本格式并且有可执行权限即可,
但是为了便于识别,笔者仍然建议使用.sh作为Shell脚本的后缀名。Shell脚本还有一个尤为重要的特性——命令替换,即可以将命令输出中提取信息并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。在脚本中处理数据时,这个特性显得尤为方便。赋值的方式有反引号(`)和$()等方式,前文已经介绍过,这里不多做赘述。注意:命令替换会创建出子Shell来运行指定命令,这是由运行脚本的Shell所生成的一个独立的Shell.因此,在子Shell中运行的命令无法使用脚本中的变量。如果在命令行中使用./路径执行命令,就会创建子Shell,但如果不加路径,则不会创建子Shell。不过,内建的Shell命令也不会创建子Shell.。这在命令行中运行脚本时要当心。openEuler24.03LTS·Kernel6.625/115Shellscript的编程实例Shell可以让你将多个命令串联起来,一次性执行完。用户可以根据已有的知识进行简单的脚本编写,如图8-9所示。openEuler24.03LTS·Kernel6.626/115图8-9一次执行多个命令openEuler24.03LTS·Kernel6.627/115Shellscript的编程实例图8-9一次执行多个命令这个脚本用到了两个简单的bashShell命令,date和ls,执行脚本后会将当前日期重定向到new.txt文件中,并将/ShellCode文件夹中的文件目录追加到new.txt目录。通过编写Shell脚本,可以将命令组合在一起执行,以此共同完成某个或者某几个功能,当需要的时候直接运行脚本文件即可,无须手动输入。openEuler24.03LTS·Kernel6.628/115Shellscript中的特殊变量在Shell中,除了用户自定义变量外,还有许多特殊变量。★(重点)它们由Shell自动设置和维护,用户无须手动定义,但可以像普通变量一样引用它们的值。这些变量通常以美元符号$开头,后跟一个特定的字符或字符串,用于表示不同的系统信息、命令执行状态、参数传递等关键内容,这里介绍Shellscript中的两类特殊变量:位置参数变量和预定义变量。•位置参数变量Shell脚本程序的执行与普通程序的执行一样,也可以带有参数。当执行一个Shell脚本时,如果希望获取到命令行的参数信息,就可以使用位置参数变量,下面介绍常用的位置参数变量。•$n:n为数字,$0代表脚本程序本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含(如${10}),未接收到的参数默认为空,如图8-10所示。openEuler24.03LTS·Kernel6.629/115图8-10$n位置参数变量openEuler24.03LTS·Kernel6.630/115Shellscript中的特殊变量图8-10$n位置参数变量•$*:$*和$@都表示所有参数的列表,指代命令行中所有的参数(不包括$0),$*用IFS(InternalFieldSeparator,内部字段分隔符)的第一个字符分隔列表(IFS默认定义为空格、制表符、换行符),即$*把所有的参数看成一个整体(当$被双引号包围时才会整体作为一个字符串),如图8-11所示。openEuler24.03LTS·Kernel6.631/115图8-11$*位置参数变量openEuler24.03LTS·Kernel6.632/115Shellscript中的特殊变量图8-11$*位置参数变量•$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待,
相当于用双引号包含的所有参数,如图8-12所示。★(重点)openEuler24.03LTS·Kernel6.633/115图8-12$@位置参数变量openEuler24.03LTS·Kernel6.634/115Shellscript中的特殊变量图8-12$@位置参数变量•$#:这个变量代表命令行中所有传入参数的个数(不算$0),如图8-13所示。★(重点)openEuler24.03LTS·Kernel6.635/115图8-13$#位置参数变量openEuler24.03LTS·Kernel6.636/115Shellscript中的特殊变量图8-13$#位置参数变量•预定义变量★(重点)预定义变量,顾名思义就是Shell设计者事先已经定义好的变量,可以直接在Shell脚本中使用,下面是常用的几个预定义变量。•$$:表示当前进程的进程号,如图8-14所示。openEuler24.03LTS·Kernel6.637/115图8-14$$预定义变量★(重点)openEuler24.03LTS·Kernel6.638/115Shellscript中的特殊变量图8-14$$预定义变量★(重点)•$!:表示后台运行的最后一个进程的进程号,如图8-15所示。openEuler24.03LTS·Kernel6.639/115图8-15$!预定义变量★(重点)openEuler24.03LTS·Kernel6.640/115Shellscript中的特殊变量图8-15$!预定义变量★(重点)说明:地址符“&”用于以后台方式运行一个脚本。•!$:它是一个特殊的命令历史扩展符号,它用于引用上一个命令的最后一个参数,如图8-16所示。openEuler24.03LTS·Kernel6.641/115图8-16!$预定义变量★(重点)openEuler24.03LTS·Kernel6.642/115Shellscript中的特殊变量图8-16!$预定义变量★(重点)•$?:最后一次执行的命令的返回状态。•如果这个变量的值为0,证明上一个命令正确执行;•如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了,如图8-17所示。openEuler24.03LTS·Kernel6.643/115图8-17$?预定义变量★(重点)openEuler24.03LTS·Kernel6.644/115Shellscript中的特殊变量图8-17$?预定义变量★(重点)openEuler24.03LTS·Kernel6.645/115SECTION2Shellscript的编程语法2Shellscript的编程语法在前文给出的简单Shell脚本中,Shell能够按照命令在脚本中出现的次序依次进行处理。对顺序操作来说这已经足够了,但是许多程序需要对脚本中的命令施加一些逻辑流程控制或者是重复某些处理过程,直至达到某个特定条件。openEuler24.03LTS·Kernel6.647/115if…then…else条件判断式if-then-else结构允许程序在满足某一条件时选择性执行一段语句,它的基本结构有如下所示的三种形式。•单条件ifconditionthencommandsfi•互斥条件ifconditionthenopenEuler24.03LTS·Kernel6.648/115if…then…else条件判断式commandselsecommandsfi•多分支条件ifconditionthencommandselifconditionopenEuler24.03LTS·Kernel6.649/115if…then…else条件判断式thencommands…elsecommandsfi该结构以if...then开始,以fi结束。条件表达式condition来自命令的执行结果、字符串与字符串之间关系运算的结果、对文件特征的判断结果,及它们之间的逻辑组合。★(重点)statements不能为空,如果确实不需要任何操作,也必须用一个“:”填充。openEuler24.03LTS·Kernel6.650/115if…then…else条件判断式表8-1列出了常用的判断条件,如果条件不是由命令生成的,应将条件放在“[]”或“[[]]”中,“[”和“]”内部表达式应使用空格分开。★(重点)表8-1Shell脚本常用判断条件用户可以用这些判断条件编写简单的逻辑判断脚本,如图8-18所示。openEuler24.03LTS·Kernel6.651/115图8-18编写简单的逻辑判断脚本openEuler24.03LTS·Kernel6.652/115if…then…else条件判断式图8-18编写简单的逻辑判断脚本if-then语句允许使用布尔运算符将测试条件组合起来使用。可以使用以下两种布尔运算符。[condition1]&&[condition2][condition1]||[condition2]条件表达式的逻辑组合“&&”与“||”两边的条件式应分别放在两个“[]”里,而添加了判断条件后时则应在同一个“[]”中,命令如下。★(重点)if[$1!=abc]&&[$1!=ABC]if[$1!=abc-a$1!=ABC]上述两条命令描述的都是输入的变量既不是abc也不是ABC,注意二者在表现形式上的差别。在逻辑与和逻辑或的表达式中,先后顺序是有意义的。openEuler24.03LTS·Kernel6.653/115if…then…else条件判断式exprA||exprB中,如果exprA为真,则不再判断exprB;同理,表达式exprA&&exprB中,也会先判断exprA,仅在它为真时才继续进行exprB的判断。★(重点)字符串比较和数学表达式比较不同。通常情况下,认为Shell变量仅具有字符的含义。因此,[$var=2]和[$var-eq2]是不一样的。前者是字符匹配,后者是数值比较。表8-2列出了常用的有关文件的逻辑测试功能,基本涵盖了对文件类型和权限的判断。表8-2常用文件比较功能可以写一些有关文件的逻辑判断脚本,如判断某个目录下是否有指定文件存在,如图8-19所示。openEuler24.03LTS·Kernel6.654/115图8-19判断某个目录下是否有指定文件存在openEuler24.03LTS·Kernel6.655/115if…then…else条件判断式图8-19判断某个目录下是否有指定文件存在openEuler24.03LTS·Kernel6.656/115test命令的测试功能到目前为止,在if语句行中看到的都是普通的Shell命令。但是if-then语句并不能测试命令退出状态码之外的条件。不过bashShell中提供了个好用的工具可以帮助用户使用if-then语句测试其他条件。test命令可以在if-then语句中测试不同的条件。如果test命令中列出的条件成立,那么test命令就会退出并返回退出状态码0。这样if-then语句的工作方式就和其他高级语言中的if-then语句差不多了。如果条件不成立,那么test命令就会退出并返回非0的退出状态码,这使得if-then语句不会再被执行。test命令的格式非常简单:testconditioncondition是test命令要测试的一系列参数和值。当用在if-then语句中时,test命令可以用如下方式表示。★(重点)openEuler24.03LTS·Kernel6.657/115test命令的测试功能iftestconditionthencommandsfi如果不写test命令的condition部分,则它会以非0的退出状态码退出并执行else代码块语句,如图8-20所示。openEuler24.03LTS·Kernel6.658/115图8-20不写test命令的condition部分openEuler24.03LTS·Kernel6.659/115test命令的测试功能图8-20不写test命令的condition部分如果加入了条件,则test命令会测试该条件。例如,可以使用test命令判断变量是否为空,如图8-21所示。openEuler24.03LTS·Kernel6.660/115图8-21添加的条件的test语句openEuler24.03LTS·Kernel6.661/115test命令的测试功能图8-21添加的条件的test语句当然,用户也可以用它来编写一些使用的判断脚本,如判断一个文件是否可写,如图8-22所示。openEuler24.03LTS·Kernel6.662/115图8-22判断文件是否可写openEuler24.03LTS·Kernel6.663/115test命令的测试功能图8-22判断文件是否可写openEuler24.03LTS·Kernel6.664/115case…in…esac条件判断式case结构用于实现某一表达式在不同取值时的分支,场景和if-then-else类似,但由于分支较多,使用case可以让程序看起来更加简练,其基本结构形式如下。★(重点)caseexpressioninpattern1)commands;;pattern2)commandsopenEuler24.03LTS·Kernel6.665/115case…in…esac条件判断式;;…esac该结构由case起,到esac结束。每个模式项(pattern1、pattern2、……)可以包含多个匹配模式,每个匹配模式之间用“|”分隔,表示“或”的关系。★(重点)只要表达式expression匹配其中的一项,该模式就有效,其后的操作将被执行,直到;;结束。下面是一个case命令的运用实例(这里使用“*”号代表其他情况),如图8-23所示。openEuler24.03LTS·Kernel6.666/115图8-23case命令运用实例openEuler24.03LTS·Kernel6.667/115case…in…esac条件判断式图8-23case命令运用实例case命令提供了一种更清晰的方法来为变量每个可能的值指定不同的处理选择。openEuler24.03LTS·Kernel6.668/115for…do...donebashShell提供了for命令,以允许创建遍历一系列值的循环。每次迭代都使用其中一个值来执行已定义好的一组命令。★(重点)for命令的基本格式如下。forvarinlistdocommandsdone区别于C语言,Shell的for结构和C语言的for结构的习惯用法不一样,它并不是为循环计数设计的。但如果循环列表是一个序列数,则可以当作计数式循环结构使用,需要提供用于迭代的一系列值作为list参数,可以是数字,字符串或者是变量。在每次迭代中,变量var包含列表中的当前值。openEuler24.03LTS·Kernel6.669/115for…do...done第一次迭代使用列表中的第一个值,第二次迭代使用列表中的第二个值,依此类椎,直到用完列表中的所有值。★(重点)do语句和done语句之间的commands可以是一个或多个标准的bashShell命令构成的指令集。在这些命令中,$var变量包含着此次迭代对应的列表中的当前值。可以用for命令遍历其自身所定义的一系列值,如图8-24所示。openEuler24.03LTS·Kernel6.670/115图8-24使用for命令进行遍历操作openEuler24.03LTS·Kernel6.671/115for…do...done图8-24使用for命令进行遍历操作每次遍历值列表时,for命令会将列表中的下一个值赋给$str变量。★(重点)$str变量可以像for命令语句中的其他脚本变量一样使用。在最后一次迭代结束后,$str变量的值在Shell脚本的剩余部分依然有效。在不做修改的情况下,它会一直保持最后一次迭代时的值。有时,用户需要在已定义好的列表末尾加上一个或多个字符串,可以使用如下方法进行追加,如图8-25所示。openEuler24.03LTS·Kernel6.672/115图8-25在已定义好的列表末尾追加字符串openEuler24.03LTS·Kernel6.673/115for…do...done图8-25在已定义好的列表末尾追加字符串★(重点)示例中,定义了一个list变量并赋予了初始值,其中包含了用于迭代的值列表。之后,脚本中还使用了另一个赋值语句向list变量包含的值列表中追加(或者说是拼接)了一项。这是向变量中已有的字符串尾部添加文本的一种常用方法。在实际工作环境中,系统管理人员常常要和文件打交道,可以用for命令自动遍历目录中的文件,如图8-26、图8-27所示。openEuler24.03LTS·Kernel6.674/115图8-26使用for命令自动遍历目录中的文件★(重点)openEuler24.03LTS·Kernel6.675/115for…do...done图8-26使用for命令自动遍历目录中的文件openEuler24.03LTS·Kernel6.676/115图8-27运行结果openEuler24.03LTS·Kernel6.677/115for…do...done图8-27运行结果openEuler24.03LTS·Kernel6.678/115whiledodone、untildodonewhile结构和until结构相似,目的也差不多,都是在一定条件下重复执行一段指令。不同的是,while结构在条件成立时重复执行一段指令,直至条件不成立;而until结构则是在条件不成立时重复执行一段指令,直至条件成立。二者的结构如下。•while语句whileconditiondocommandsdone•until语句openEuler24.03LTS·Kernel6.679/115whiledodone、untildodoneuntilconditiondocommandsdone先来看一个while循环的例子,如图8-28所示。openEuler24.03LTS·Kernel6.680/115图8-28while循环示例openEuler24.03LTS·Kernel6.681/115whiledodone、untildodone图8-28while循环示例同样地例子用until语句描述,如图8-29所示。openEuler24.03LTS·Kernel6.682/115图8-29until语句示例openEuler24.03LTS·Kernel6.683/115whiledodone、untildodone图8-29until语句示例在上述案例中,只要把while的条件反过来,就可以换成until结构,即:•while循环:只要条件为真(true),就继续执行循环体。•until循环:只要条件为假(false),就继续执行循环体。另外,在while循环中循环条件不是必要的,可以把循环条件忽略掉,其语法格式如下。while:;docommanddoneopenEuler24.03LTS·Kernel6.684/115SECTION3实验项目:Shell编程3实验项目:Shell编程•实验目的掌握Shell编程中条件语句、循环语句的使用方法。•实验步骤•创建一个新文件lab.sh,向文件中写入如下代码并保存。•该脚本用于扫描指定目录中所有普通文件,统计它们按扩展名的出现次数,并列出大小大于等于阈值的大文件,最后给出汇总。#!/bin/shDIR=/var/log#固定扫描目录(可改成任意路径)LIMIT=1#大小阈值(MB)#1.目录检查if[-d"$DIR"];openEuler24.03LTS·Kernel6.686/115实验项目:Shell编程thenecho"目录$DIR存在,开始扫描"elseecho"目录不存在,实验结束"exit1fi#2.临时目录TMP=./tmp_labopenEuler24.03LTS·Kernel6.687/115实验项目:Shell编程mkdir"$TMP"2>/dev/nullbig_list=$TMP/big.txtext_file=$TMP/ext.txttotal=0#3.主循环forfin"$DIR"/*;do[-f"$f"]||continueopenEuler24.03LTS·Kernel6.688/115实验项目:Shell编程total=$((total+1))#大小(MB)size_mb=$(du-m"$f"|{readsz_;echo"$sz";})#记录大文件if["$size_mb"-ge"$LIMIT"];thenopenEuler24.03LTS·Kernel6.689/115实验项目:Shell编程echo"$f">>"$big_list"fi#扩展名fname=${f##*/}ext=${fname##*.}["$ext"="$fname"]&&ext="noext"#手工计数:确保每行都是“扩展名
数字”found=0openEuler24.03LTS·Kernel6.690/115实验项目:Shell编程cp"$ext_file""$ext_file.tmp"2>/dev/null||::>"$ext_file"whilereadline;doe=${line%*}n=${line#*}#跳过空行或格式不对的行[-z"$e"]||[-z"$n"]&&continueopenEuler24.03LTS·Kernel6.691/115实验项目:Shell编程if["$e"="$ext"];thenn=$((n+1))found=1fiprintf'%s%s'"$e""$n">>"$ext_file"done<"$ext_file.tmp"2>/dev/null||:["$found"=0]&&printf'%s%s'"$ext""1">>"$ext_file"openEuler24.03LTS·Kernel6.692/115实验项目:Shell编程done#4.输出大文件echoecho"大小≥${LIMIT}MB的文件:"touch"$big_list"i=0whilereadpath;doopenEuler24.03LTS·Kernel6.693/115实验项目:Shell编程[-z"$path"]&&continuei=$((i+1))printf'%2d)%s'"$i""$path"done<"$big_list"#5.输出扩展名计数echoecho"扩展名计数:"touch"$ext_file"openEuler24.03LTS·Kernel6.694/115实验项目:Shell编程whilereaden;do[-z"$e"]||[-z"$n"]&&continueprintf'%-10s:%d'"$e""$n"done<"$ext_file"#6.结论echobig_num=$(cat"$big_list"|{c=0;openEuler24.03LTS·Kernel6.695/115实验项目:Shell编程whileread_;doc=$((c+1));done;echo"$c";})if["$total"-eq0];thenecho"该目录下无任何普通文件"openEuler24.03LTS·Kernel6.696/115实验项目:Shell编程elif["$big_num"=0];thenecho"所有文件均小于${LIMIT}MB"elseecho"共扫描$total个文件,其中$big_num个大文件"fi•为文件添加执行权限chmodu+xlab.shopenEuler24.03LTS·Kernel6.697/115实验项目:Shell编程•结束后查看同目录下的tmp_lab/文件夹,其中big.txt记录了上级目录中所有大小大于等于阈值的文件的路径,ext.txt中记录了上级目录各扩展名出现次数,脚本运行结果如图8-30~图8-32所示。openEuler24.03LTS·Kernel6.698/115图8-30脚本运行结果(1)openEuler24.03LTS·Kernel6.699/115实验项目:Shell编程图8-30脚本运行结果(1)openEuler24.03LTS·Kernel6.6100/115图8-31脚本运行结果(2)openEuler24.03LTS·Kernel6.6101/115实验项目:Shell编程图8-31脚本运行结果(2)openEuler24.03LTS·Kernel6.6102/115图8-32运行产生的文件夹openEuler24.03LTS·Kernel6.6103/115实验项目:Shell编程图8-32运行产生的文件夹openEuler24.03LTS·Kernel6.6104/115SECTION4责任培养:技术创新与知识产权保护4责任培养:技术创新与知识产权保护在探讨技术创新的过程中,不可避免地要提及知识产权保护的重要性。技术创新是推动社会进步和经济发展的关键力量,而知识产权保护则是保障创新成果得以有效转化和应用的重要机制。在数字化和信息化的时代背景下,技术创新的速度日益加快,新的技术、产品和服务层出不穷。这些创新成果不仅为企业带来了竞争优势,也为整个社会创造了巨大的经济价值。然而,技术创新的过程往往伴随着巨大的投入和风险,如果创新成果得不到有效的保护,那么创新者的利益就会受到损害,进而影响到整个社会的创新动力。知识产权保护制度为创新者提供了一系列法律手段,以确保他们的创新成果能够得到合理的回报。通过专利、商标、著作权等知识产权的保护,创新者可以对自己的技术、品牌、作品等享有独占权,从而防止他人未经授权地使用或复制。这不仅保护了创新者的合法权益,也激励了更多的人投身于技术创新活动。同时,知识产权保护还有助于促进技术转移和成果转化。在知识产权保护制度的保障下,创新者可以更加放心地将自己的技术成果转让给他人或许可他人使用,从而实现技术的快速传播和广泛应用。openEuler24.03LTS·Kernel6.6106/115责任培养:技术创新与知识产权保护这不仅有助于提升整个社会的科技水平,也为创新者带来了可观的经济收益。总的来说,技术创新与知识产权保护是相辅相成的。技术创新需要知识产权保护制度的支撑和保障,而知识产权保护制度也需要不断地适应技术创新的发展需求。在未来的发展中,应该进一步完善知识产权保护制度,加强执法力度,提高全社会的知识产权意识,为技术创新提供更加良好的法治环境和市场环境。并且Shell脚本语法简洁、学习成本低,并且Shell脚本还可以在C程序里被调用。★(重点)如果你想精通系统管理,那么了解和掌握Shell脚本的编写是必要的。Shell脚本提供的if...then...else条件判断式、test命令的测试功能、case...in...esac条件判断式,及for...do...done、whiledodone、untildodone等循环结构为用户编写复杂脚本提供了有力支持,能够更加游刃有余的去管理系统。openEuler24.03LTS·Kernel6.6107/115第8章Shellscript基本知识与语法★重点本章小结openEuler24.03LTS·Kernel6.6108/115本章小结·核心知识回顾①不管实在openEuler还是Linux得其他发行版中,很多工作通过脚本来完成会非常方便。并且Shell脚本语法简洁、学习成本低,并且Shell脚本还可以在C程序里被调用。如果你想精通系统管理,那么了解和掌握Shell脚本的编写是必要的。Shell脚本提供的if...then...else条件判断式、test命令的测试功能、case...in...esac条件判断式,及for...do...done、whiledodone、untildodone等循环结构为用户编写复杂脚本提供了有力支持,能够更加游刃有余的去管理系统。②通过本章学习,读者应初步掌握了Shell脚本的编写方法,能够利用其自动化执行任务,提高工作效率。后续可继续深入学习,探索更多高级应用。第8章Shellscript基本知识与语法★重点本章小结openEuler24.03LTS·Kernel6.6109/115本章小结·重点命令速查表分类命令作用/说明脚本首行#!/bin/bash指定Bash解释器条件判断ifcondition;thencommands;fi单分支条件结构if/elseif...then...else...fi双分支条件结构if/elifif...elif...else...fi多分支条件结构逻辑组合[c1]&&[c2]/||逻辑与/逻辑或test命令testcondition测试条件表达式case多分支caseexprinp1)...;;esac模式匹配多分支for循环forvarinlist;do...done列表循环while循环whilecondition;do...done条件循环until循环untilcondition;do...done直到条件为真停止无限循环while:;do...done忽略循环条件执行权限chmodu+xlab.sh为脚本添加执行权限第8章Shellscript基本知识与语法★重点本章小结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026公务员时事政治热点必考题库及完整答案
- 2026绵阳南山中学高一语文分班考试真题含答案
- (2026)执业药师中医考试题库附参考答案
- (2026)执业药师中医试题(附答案)
- 肺结核早期症状识别与规范治疗课件
- 狂犬病暴露后处置(PEP)全流程课件
- 2026年服装设计服装造型设计师试题及答案
- 2026年智能交通系统智能交通智能交通性能测试工程师资格考试试题及答案
- 2020-2021年部编人教版五年级语文上册期中测试卷(附答案)
- 2026年新生儿黄疸评估干预三基培训考核计划
- 安远县(2026年)检察院书记员考试试题及答案
- 2026徐州工程机械产业集群创新发展现状投资布局规划分析研究报告
- 农机修理工职业技能等级认定考试复习题库(附答案)
- 雨课堂学堂在线学堂云《实验室安全教育(西南石油)》单元测试考核答案
- 2026年包头铁道职业技术学院单招职业技能测试题库附答案详解(满分必刷)
- 2025-2030中国硼矿行业营销模式及竞争格局分析研究报告
- 企业薪酬激励制度设计与实施案例
- 江西省2018-2024年中考满分作文121篇
- 城市更新项目的房地产营销方案
- 地氟烷的临床应用
- 围手术期疼痛管理新进展
评论
0/150
提交评论