本文是Bash编程系列中的最后一篇,由三部分组成,旨在学习如何使用循环执行迭代操作。Bash是一种用于命令行和shell脚本的强大编程语言。本系列的所有三个部分都基于我的三集Linux自学课程,探索如何使用CLI在bash中编程。本系列的第一篇文章讨论了bash编程的一些简单命令行操作,例如使用变量和控制运算符。第二篇文章探讨了文件、字符串、数字等类型,以及在执行流程中提供控制逻辑的各种逻辑运算符,以及bash中的各种扩展。本文是第三篇(也是最后一篇)文章,旨在探讨循环在各种迭代操作中的使用,以及如何合理控制循环。循环我曾经使用过的每种编程语言都至少有两个循环结构来执行重复操作。我经常使用for循环,但我发现while和until循环也很有用。for循环我的理解是bash中实现的for命令比大多数语言更灵活,因为它可以处理非数值;相比之下,标准C语言等for循环只能处理数值。for命令的Bash版本的基本结构非常简单:forVarinlist1;做清单2;done解释:“对list1中的每一个值,将$Var设置为该值,并使用该值执行list2中的程序语句;list1中的所有值执行完毕后,整个循环结束,循环退出。”list1中的值可以是简单的显式字符串值,也可以是命令执行的结果(``包含命令执行结果,在本系列的第二篇文章中介绍)。我经常使用这种结构。为了测试它,make确保~/testdir仍然是当前工作目录(PWD)。要删除目录中的所有内容,请参见这个简单的for循环示例,它明确地写出值列表。这个列表是字母和数字的混合——但是不要'忘记在bash中所有变量都是字符串或者可以被视为字符串。[student@studentvm1testdir]$rm*[student@studentvm1testdir]$forIinabcd1234;做echo$I;doneabcd1234给变量起一个更有意义的名字,成为上一个版本的高级版本:[student@studentvm1testdir]$forDeptin"HumanResources"SalesFinance"InformationTechnology"EngineeringAdministrationResearch;做echo"Department$Dept";doneDepartmentHumanResourcesDepartmentSalesDepartmentFinanceDepartmentInformationTechnologyDepartmentEngineeringDepartmentAdministrationResearchcreatesseveraldirectoryWorkingonInformation):[student@studentvm1testdir]$forDeptin"HumanResources"SalesFinance"InformationTechnology"EngineeringAdministrationResearch;doecho"在部门$Dept工作";mkdir"$部门";完成部门人力资源部门工作部门销售工作部门财务工作部门信息技术工作部门工程部门工作部门行政onWorkingonDepartmentResearch[student@studentvm1testdir]$lltotal28drwxrwxr-x2student学生4096Apr815:45Administrationdrwxrwxr-x2student学生4096Apr815:45Engineeringdrwxrwxr-x2student学生4096Apr815:45Financedr-wxrwxrx2student学生4096Apr815:45'人力资源'drwxrwxr-x2student学生4096Apr815:45'信息技术'drwxrwxr-x2student学生4096Apr815:45Researchdrwxrwxr-x96815:45mkdir语句中Sales的$Dept变量必须用引号引起来;否则,名称中有空格的(如InformationTechnology)将被视为两个单独的目录。我一直信奉的一条实用规则:所有文件和目录都应该是一个单词(中间没有空格)。虽然大多数现代操作系统可以处理名称之间带有空格的名称,但系统管理员需要花费额外的精力来确保脚本和CLI程序正确处理这些特殊情况。(尽管它们很烦人,但一定要考虑它们,因为你永远不知道你将拥有什么文件。)再次删除~/testdir下面的所有东西—再运行一次下面的命令:[student@studentvm1testdir]$rm-rf*;lltotal0[student@studentvm1testdir]$forDeptinHuman-ResourcesSalesFinanceInformation-TechnologyEngineeringAdministrationResearch;doecho"在部门$Dept工作";mkdir"$部门";完成在部门人力资源上工作在部门销售上工作在部门财务上工作在部门信息技术上工作在部门工程上工作在部门行政上工作在部门研究上工作[student@studentvm1testdir]$lltotal28drwxrwxr-x2student学生4096Apr815:52Administrationdrwxrwxr-x2学生学生40964月8日15:52工程drwxrwxr-x2学生学生40964月8日15:52金融drwxrwxr-x2学生学生40964月8日15:52人力资源drwxrwxr-x2学生学生40964月8日15:52信息技术drwxrwxr-x2学生学生4096Apr815:52Researchdrwxrwxr-x2学生学习nt4096Apr815:52Sales假设需要列出Linux机器上的所有RPM包,并为每个包附加一个简短的描述。我在北卡工作的时候,遇到过这种需求。由于当时开源还没有被国家“批准”,而我只在台式机上使用Linux,我的技术娴熟的老板(PHB)让我列出我电脑上安装的所有软件,以便他们“批准”一个特例。你如何实现它?一种方法是,已知rpm–qa命令可提供RPM包的完整描述,包括白痴老板想要的:软件名称和概要描述。让我们逐步执行以获得最终结果。首先,列出所有RPM包:[student@studentvm1testdir]$rpm-qaperl-HTTP-Message-6.18-3.fc29.noarchperl-IO-1.39-427.fc29.x86_64perl-Math-Complex-1.59-429。fc29.noarchlua-5.3.5-2.fc29.x86_64java-11-openjdk-headless-11.0.ea.28-2.fc29.x86_64util-linux-2.32.1-1.fc29.x86_64libreport-fedora-2.9.7-1.fc29.x86_64rpcbind-1.2.5-0.fc29.x86_64libsss_sudo-2.0.0-5.fc29.x86_64libfontenc-1.1.3-9.fc29.x86_64
