shell中for范围循环循环语句与while死循环语句

for循环语句
具有循环范围的语句
①按照指定序列信息进行循环
②根据文件行数信息进行循环
③根据字符串的数量进行循环
④根据命令输出信息进行循环

语法格式:

for 变量名  in  循环取值列表
do
    执行循环命令主体
done

命令行使用方式(其实就是比脚本方式多了;每个需要换行的地方就写;)
在这里插入图片描述
for循环的嵌入循环方式

①爷爷–爸爸–儿子
②爸爸—大儿子/小儿子

实现1到100求和运算,如何使用for循环实现

脚本内容

#!/bin/bash
for i in {1..100}
do
  x=$[x+i]
done
echo $x

这个脚本把我绕蒙了。。。
思路:
①for循环取值
②此时取的值与后一次取的值进行相加
③循环体外最后一次输出总和

我卡死在了思路二
现在也不很明白 怎么做一个“存储器”将每次i取的值与后一次i取的值进行相加存储,最后输出。

x=x+i
① ②
这个式子,默认x不给予赋值时,x默认为0.这是默认的一个规则。
黄 x 总和x的数值
第一次取值:i=1 x=0 总和x=1
第二次取值:i=2 x=1 总和x=1+2
第三次取值:i=3 x=3 总和x=(1+2)+3

我是这样找到的方法,但是我多举了几个例子才得出的,不是想出来的,老感觉有点绕。

x=$[x+i] 这是两个变量数值相加,赋值给x变量。

利用for循环实现打印99乘法表

#!/bin/bash
for i in {1..9} #取出第一个数字
do
  for n in {1..9}  #取出一轮1-9的数字;问题:1*(1-9)这是一轮 第二轮2*(1-9)重复了
一个2*1
   do
     if [ $i -ge $n ]
     then
     echo -n  "$i*$n=$[$i*$n] "
     fi
   done
 echo ""
done
[root@lsy script 09:11:46]# sh lsy.sh
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

我一开始写出的结果是

[root@lsy script 09:07:37]# sh lsy.sh
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 
6*6=36 6*7=42 6*8=48 6*9=54 
7*7=49 7*8=56 7*9=63 
8*8=64 8*9=72 
9*9=81 

将$n 和 $i的位置调换一下就可以修改过来了。
解释脚本:
大循环取一个数值,就可以让小循环取一遍数值
也就是爸爸辈的取出一个1 儿子辈的取出1到9。
问题在于怎么解决 重复的问题
1x2 2x1是重复的。

#!/bin/bash
for i in {1..9} #取出第一个数字
do
  for n in {1..9}  #取出一轮1-9的数字;问题:1*(1-9)这是一轮 第二轮2*(1-9)重复了一个2*1
   do
     if [ $i -ge $n ] #解决重复的问题,只有第一个for循环取的数值大于第二个for循环取的数值时才可以进行运算,否则不进行操作
     then
     echo -n  "$i*$n=$[$i*$n] "  #-n参数是为了不让输出内容进行换行 冒号后面有两个空格时为了间隔 后面的输出(横向输出)。
     fi
   done
 echo "" # (执行完一次第一个for循环取出的数值,进行换行,每执行完第一个for循环取出的一个数值,都进行一次换行)
done

这个脚本的for循环使用嵌套类型是属于爸爸—儿子的类型;
还不是爷爷—爸爸–儿子的三层嵌套

别人的解法:

  #!/bin/bash
  for num1 in `seq 9`   
  do
     for num2 in `seq 9` 
     do
        if [ $num1 -ge $num2 ]
        then
           if ((($num1*$num2) > 9))
           then
              echo -n "${num1}x${num2}=$((num1*num2)) "
           else
              echo -n "${num1}x${num2}=$((num1*num2))  "
           fi
        fi
     done
  echo " "
  done

打印等腰三角形
思路:
① 行数信息 等于传入的参数 最外层循环范围
②列数信息

  #!/bin/bash
      read -p "please input num: " i
      for a in `seq $i`
      do
         b=$[$i-$a] # 输入空格列信息
         for b in `seq $b`
         do
            echo -n " "
         done
         for c in `seq $a`
         do
           echo -n "* "
         done
         echo
      done

注意:
$[ $i- $n] 的方式可以直接运算变量

具体办法

补充:嵌入式循环
情况一:爷爷–爸爸–儿子 三层嵌套循环

#!/bin/bash
for a in {1…3}
do
echo $a
for b in {a…c}
do
echo a a b
for c in {A…C}
do
echo a a b$c
done
done
done
情况二:爸爸—儿子①/儿子②

 #!/bin/bash
      for a in {1..3}
      do
         echo $a
         for b in {a..c}
         do
            echo $a$b
         done
         for c in {A..C}
         do
            echo $a$b$c
         done  
      done

while循环语句
具有循环条件
① 只要条件为真,就会一直循环下去

语法格式
方法一:

while true
	  do
	     echo oldboy 
	  done	

方法二:不是死循环效果

   while ((条件语句))  [条件语句]
      do 
         动作
	  done
	  
	  i=0

方法三:不是死循环效果

  while read 变量名 
	  do 
	     echo $变量名
	  done < user.txt

命令行的使用方式

while read line ;do echo $line ;done<user.txt

循环控制语句
exit 退出整个脚本 不再继续执行
break 跳出本次循环 继续执行下面操作(跳出循环,进入下一个语句)
continue 本次循环结束,继续下一次循环(不跳出循环,只是将循环给提前结束了。仍在本次语句中捯饬)

发布了224 篇原创文章 · 获赞 19 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42506599/article/details/105396040