当前位置: 首页 > 科技观察

关于shell脚本中循环的一些总结_0

时间:2023-03-15 23:01:13 科技观察

不管是什么计算机语言,循环都是绕不开的话题,Shell当然也不例外。下面总结了shell脚本中常用的循环相关的一些知识点,新手朋友可以参考。for循环Shell脚本中最简单的循环就是for循环,有编程基础的朋友应该都用过for循环。最简单的for循环如下,只需要依次写入in后面的变量值即可:#!/bin/bashfornumin1234doecho$numdone如果要循环的内容是字母表中连续的字母或者连续的数字,那么就可以写出脚本按照如下语法:#!/bin/bashforxin{a..z}doecho$xdonewhileloop除了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命令获取当前系统时间,然后按顺序打印出来:,我们经常需要判断一个变量的值是大于还是小于某个数。有时候这个数是由另一个变量来表示的,这时我们就需要判断这个变量的值是否是一个数。共有三种判断方式:#!/bin/bashecho-n"HowmanytimesshouldIsayhello?"readansif["$ans"-eq"$ans"];thenechook1fiif[[$ans=*[[:digit:]]*]];thenechook2fiif[["$ans"=~^[0-9]+$]];thenechook3fi第一种方法看似废话,其实-eq只能用于值之间的判断,如果是字符串,judgeFailed,所以这样保证ans是一个数值型变量。第二种方法是直接使用shell通配符判断变量。第三种方法更直接,用正则表达式判断变量。直接看例子:#!/bin/bashecho-n"HowmanytimesshouldIsayhello?"readansif["$ans"-eq"$ans"];then=1while[$n-le$ans]doechohello((n++))donefi在这个脚本中,我将循环次数传递给ans变量,然后脚本多次打印hello。为了保证我们传入的内容是一个数字,我们使用if["$ans"-eq"$ans"]语句来判断。如果我们传入的不是数字,我们就不会进入while循环。循环输出文本文件内容如果你想逐行循环输出文本文件内容,你可以这样做:#!/bin/bashecho-n"File>"readfilen=0whilereadline;do((n++))echo"$n:$line"done<$file这里我们使用read命令将文本文件的内容读取并存储到file变量中,然后使用重定向(上面脚本的最后一行)将文件内容传入while循环处理然后打印出来。无限循环有时候我们需要做一件事情永远做下去,这时我们可以使用无限循环。实现这一点很容易,只需在true时使用即可。#!/bin/bashwhiletruedoecho-n"Stillrunningat"datesleep1done在上面的脚本中,它会每隔1秒打印Stillrunningatspecifictime直到你按下Ctrl+C终止脚本。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!