一、shell的for循环语句
1. for循环语法结构
㈠ 列表循环
列表for循环:用于将一组命令执行**已知的次数**
基本语法格式
forvariablein {list} docommandcommand…done或者forvariableinabcdocommandcommanddone
举例说明
#forvarin {1..10};doecho$var;done#forvarin12345;doecho$var;done#forvarin`seq10`;doecho$var;done#forvarin$(seq10);doecho$var;done#forvarin {0..10..2};doecho$var;done#forvarin {2..10..2};doecho$var;done#forvarin {10..1};doecho$var;done#forvarin {10..1..-2};doecho$var;done#forvarin`seq10-21`;doecho$var;done
㈡ 不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数
基本语法格式
forvariabledocommandcommand…done
举例说明
#!/bin/bashforvardoecho$vardoneecho"脚本后面有$#个参数"
㈢ 类C风格的for循环
基本语法结构
for(( expr1;expr2;expr3 )) docommandcommand…donefor (( i=1;i<=5;i++)) doecho$idoneexpr1:定义变量并赋初值expr2:决定是否进行循环(条件)expr3:决定循环变量如何改变,决定循环什么时候退出
举例说明
#for ((i=1;i<=5;i++));doecho$i;done#for ((i=1;i<=10;i+=2));doecho$i;done#for ((i=2;i<=10;i+=2));doecho$i;done
2. 应用案例
㈠ 脚本计算1-100奇数和
① 思路
定义一个变量来保存奇数的和 sum=0
找出1-100的奇数,保存到另一个变量里 i=遍历出来的奇数
从1-100中找出奇数后,再相加,然后将和赋值给变量 循环变量 for
遍历完毕后,将sum的值打印出来
② 落地实现(条条大路通罗马)
#!/bin/envbash#计算1-100的奇数和#定义变量来保存奇数和sum=0#for循环遍历1-100的奇数,并且相加,把结果重新赋值给sumforiin {1..100..2} doletsum=$sum+$idone#打印所有奇数的和echo"1-100的奇数和是:$sum"方法1:#!/bin/bashsum=0foriin {1..100..2} dosum=$[$i+$sum] doneecho"1-100的奇数和为:$sum"方法2:#!/bin/bashsum=0for ((i=1;i<=100;i+=2)) doletsum=$i+$sumdoneecho"1-100的奇数和为:$sum"方法3:#!/bin/bashsum=0for ((i=1;i<=100;i++)) doif [ $[$i%2] -ne0 ];thenletsum=$sum+$ifi或者test$[$i%2] -ne0&&letsum=$sum+$idoneecho"1-100的奇数和为:$sum"方法4:sum=0for ((i=1;i<=100;i++)) doif [ $[$i%2] -eq0 ];thencontinueelseletsum=$sum+$ifidoneecho"1-100的奇数和为:$sum"#!/bin/bashsum=0for ((i=1;i<=100;i++)) dotest$[$i%2] -eq0&&continue||letsum=sum+$idoneecho"1-100的奇数和是:$sum"
③ 循环控制语句
循环体: do…done之间的内容
continue:继续;表示循环体内下面的代码不执行,重新开始下一次循环
break:打断;马上停止执行本次循环,执行循环体后面的代码
exit:表示直接跳出程序
[root~]#catfor5.sh#!/bin/bashforiin {1..5} dotest$i-eq2&&break||touch/tmp/file$idoneechohellohahahah
㈡ 判断所输整数是否为质数
质数(素数):只能被1和它本身整除的数叫质数。
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
① 思路
让用户输入一个数,保存到一个变量里 read -p "请输入一个正整数:" num
如果能被其他数整除就不是质数——>$num%$i 是否等于0 $i=2到$num-1
如果输入的数是1或者2取模根据上面判断又不符合,所以先排除1和2
测试序列从2开始,输入的数是4——>得出结果$num不能和$i相等,并且$num不能小于$i
② 落地实现
#!/bin/envbash#定义变量来保存用户所输入数字read-p"请输入一个正整数字:"number#先排除用户输入的数字1和2[ $number-eq1 ] &&echo"$number不是质数"&&exit[ $number-eq2 ] &&echo"$number是质数"&&exit#循环判断用户所输入的数字是否质数foriin`seq2$[$number-1]`do [ $[$number%$i] -eq0 ] &&echo"$number不是质数"&&exitdoneecho"$number是质数"优化思路:没有必要全部产生2~$[$number-1]序列,只需要产生一半即可。更好解决办法:类C风格完美避开了生成序列的坑for (( i=2;i<=$[$number-1];i++)) do [ $[$number%$i] -eq0 ] &&echo"$number不是质数"&&exitdoneecho"$number是质数"
㈢ 批量创建用户
**需求:**批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123
① 思路
添加用户的命令 useradd -G class
判断class组是否存在 grep -w ^class /etc/group 或者groupadd class
根据题意,判断该脚本循环5次来添加用户 for
给用户设置密码,应该放到循环体里面
② 落地实现
#!/bin/envbash#判断class组是否存在grep-w^class/etc/group&>/dev/nulltest$?-ne0&&groupaddclass#循环创建用户for ((i=1;i<=5;i++)) douseradd-Gclassu$iecho123|passwd--stdinu$idone#用户创建信息保存日志文件方法一:#!/bin/bash#判断class组是否存在grep-wclass/etc/group&>/dev/null[ $?-ne0 ] &&groupaddclass#批量创建5个用户foriin {1..5} douseradd-Gclassu$iecho123|passwd--stdinu$idone方法二:#!/bin/bash#判断class组是否存在cut-d: -f1/etc/group|grep-wclass&>/dev/null[ $?-ne0 ] &&groupaddclass#循环增加用户,循环次数5次,for循环,给用户设定密码for ((i=1;i<=5;i++)) douseraddu$i-Gclassecho123|passwd--stdinu$idone方法三:#!/bin/bashgrep-wclass/etc/group&>/dev/nulltest$?-ne0&&groupaddclass或者groupaddclass&>/dev/nullfor ((i=1;i<=5;i++)) douseradd-Gclassu$i&&echo123|passwd--stdinu$idone