不管是什么计算机语言,循环都是绕不开的话题,Shell当然也不例外。下面总结了shell脚本中常用的循环相关的一些知识点,新手朋友可以参考。for循环Shell脚本中最简单的循环就是for循环,有编程基础的朋友应该都用过for循环。最简单的for循环如下,只需要在in后面依次写上变量值即可:#!/bin/bashfornumin1234doecho$numdone如果要循环的内容是连续的字母或连续的#!/bin/bashforxin{a..z}doecho$xdonewhile循环除了for循环外,shell还提供了while循环。在其他语言中,如果你见过for循环但没见过while循环,那么你一定是学了假语言。在while循环中,每执行一次循环,都会对条件求值一次,决定是否继续循环。其实当循环次数比较少的时候,for循环的效果和while循环差不多,但是如果循环次数比较多,比如10万次,那么while循环的优势就会发挥出来得到体现。#!/bin/bashn=1while[$n-le4]doecho$n((n++))done循环中的循环与其他高级语言一样,循环可以相互嵌套。例如下面的例子,我们在while循环中插入一个for循环:#!/bin/bashn=1while[$n-lt6]doforlin{a..d}doecho$n$ldone((n++))done这个脚本执行的结果应该是1a,1b,1c,1d,2a,2b...5d。循环的内容发生变化。在我们上面提到的for循环中,循环变量要赋值的值都列在in后面的列表中。但是这样太不灵活了,因为很多时候循环变量要获取的值是不固定。比如有个变量获取当前系统的所有用户,但是因为每个电脑用户不一样,我们没办法把这个变量写死。这种情况下,我们可以使用ls命令列出/home目录下的所有用户,然后使用循环变量依次获取。完整代码如下:#!/bin/bashforuserin`ls/home`doecho$userdone当然,除了ls,Shell还支持其他命令。例如,我们可以使用date命令获取当前系统时间,然后按顺序打印出来:$forwordin`date`>do>echo$word>doneThuApr908:12:09CST2020变量值检查当我们使用while循环中,我们经常需要判断一个变量的值是大于还是小于某个数。有时候这个数是由另一个变量来表示的,这时我们就需要判断这个变量的值是否是一个数。共有三种判断方式:#!/bin/bashecho-n"我应该打多少次招呼?"阅读ansif["$ans"-eq"$ans"];然后echook1fiif[[$ans=*[[:digit:]]*]];然后echook2fiif[["$ans"=~^[0-9]+$]];那么echook3fi第一种方法看似废话,但实际上,-eq只能用于值之间的判断。如果是字符串,就会判断失败,所以这样就保证了ans是一个数值型变量。第二种方法是直接使用shell通配符判断变量。第三种方法更直接,用正则表达式判断变量。直接举个例子吧:#!/bin/bashecho-n“我应该打多少次招呼?”阅读ansif["$ans"-eq"$ans"];thenn=1while[$n-le$ans]doechohello((n++))donefi在这个脚本中,我将循环次数传递给ans变量,然后脚本多次打印hello。为了保证我们传入的内容是一个数字,我们使用if["$ans"-eq"$ans"]语句来判断。如果我们传入的不是数字,我们就不会进入while循环。2020精选阿里/腾讯等一线公司面试、简历、进阶、电子书公众号『良序Linux』后台回复『数据』免费获取循环输出文本文件内容如果要循环逐行输出文本文件内容,可以这样操作:#!/bin/bashecho-n"File>"readfilen=0whilereadline;do((n++))echo"$n:$line"done<$file这里我们使用read命令读取文本文件的内容存入file变量,然后使用重定向(上面最后一行script)将文件内容传入while循环进行处理,然后打印出来。无限循环有时候我们需要做一件事情永远做下去,这时我们可以使用无限循环。实现这一点很容易,只需在true时使用即可。#!/bin/bashwhiletruedoecho-n"Stillrunningat"datesleep1done在上面的脚本中,Stillrunningatspecifictime将每1秒打印一次,直到您按Ctrl+C终止脚本。看到的都是真爱,走之前怎么不竖个大拇指?您的“三通”是良旭继续创作的最大动力!关注原创公众号《良序Linux》,第一时间获取最新Linux干货!公众号后台回复【信息】【面试】【简历】获取精选一线大厂的面试、自我提升、简历等信息。关注我的博客:lxlinux.net
