Shell编程中的多重循环(99乘法表及各种图形)

目录

1、双层循环中的基本思路

2、exit、break、continue

2.1 exit

2.2break

2.3continue

3、99乘法表

4、输出直线

5、输出矩形

5.1实心矩形

5.2空心矩形

6、三角形

6.1右直角三角形

6.2倒直角三角形

6.3反直角三角形

6.4等腰三角形

6.5等腰倒三角

7、菱形


1、双层循环中的基本思路

外层循环每执行一次,内层循环都要全部执行完毕后,下一次外层循环才能再执行

#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))   
do 
  echo "outer 1oop:$i"
  #内层循环,看作外层循环的一个命令语句
  for ((j=1;j<=3;j++)) 
  do 
    echo "  inter loop:$j"
  done
done
outer 1oop:1
  inter loop:1
  inter loop:2
  inter loop:3
outer 1oop:2
  inter loop:1
  inter loop:2
  inter loop:3
outer 1oop:3
  inter loop:1
  inter loop:2
  inter loop:3

 

2、exit、break、continue

2.1 exit

退出shell脚本进程,exit执行后,脚本后面的所有语句都不会执行

[root@localhost demo]# vim xun.sh

#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
  echo "outer 1oop:$i"
  #内层循环,看作外层循环的一个命令语句
  for ((j=1;j<=3;j++))
  do
    echo "  inter loop:$j"
    if [ $j -eq 3 ];then
      #直接退出脚本 j=3的时候即内层循环执行3次 就直接退出脚本,不会进入下一轮的外层循环
      exit
    fi
  done
done
[root@localhost demo]# bash xun.sh 
outer 1oop:1
  inter loop:1
  inter loop:2
  inter loop:3

2.2break

跳出当前循环跳,break 2 跳出两层循环(双层循环),循环内break后面的语句不会执行,但是不会影响循环外面的语句

[root@localhost demo]# vim xun.sh

#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
  echo "outer 1oop:$i"
  #内层循环,看作外层循环的一个命令语句
  for ((j=1;j<=3;j++))
  do
    echo "  inter loop:$j"
    if [ $j -eq 2 ];then
      #跳出当前循环(单层循环)
      break
    fi
  done
done
[root@localhost demo]# bash xun.sh 
outer 1oop:1
  inter loop:1
  inter loop:2
outer 1oop:2
  inter loop:1
  inter loop:2
outer 1oop:3
  inter loop:1
  inter loop:2

  •  break 2
[root@localhost demo]# vim xun.sh

#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
  echo "outer 1oop:$i"
  #内层循环,看作外层循环的一个命令语句
  for ((j=1;j<=3;j++))
  do
    echo "  inter loop:$j"
    if [ $j -eq 2 ];then
      #跳出两次循环
      break 2
    fi
  done
done
echo "123"
[root@localhost demo]# bash xun.sh 
outer 1oop:1
  inter loop:1
  inter loop:2
123

2.3continue

终止某次循环的执行,但不会完全终止整个循环,while和until循环中使用需要慎重 ,因为如果continue放在变量迭代语句前会造成死循环

[root@localhost demo]# vim xun.sh

#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
  echo "outer 1oop:$i"
  #内层循环,看作外层循环的一个命令语句
  for ((j=1;j<=3;j++))
  do
    if [ $j -eq 2 ];then
      #结束j=2的循环 继续执行下一次的循环
      continue
    fi
    echo "  inter loop:$j"
  done
done
[root@localhost demo]# bash xun.sh 
outer 1oop:1
  inter loop:1
  inter loop:3
outer 1oop:2
  inter loop:1
  inter loop:3
outer 1oop:3
  inter loop:1
  inter loop:3

3、99乘法表

  • 使用for循环
[root@localhost demo]# vim chengfabiao.sh 

#!/bin/bash
#外层循环i控制行
for ((i=1; i<=9; i++))
do
  #内层循环j控制列,列数小于等于行数的时候执行for循环
  for ((j=1; j<=$i; j++))
  do
    #乘法表的结果为行数代表的值*列数代表的值
    let sum=i*j
    #不换行且使用tab制表符进行分隔    
    echo -n -e "$j*$i=$sum\t"
  done
#没执行完内层循环就换行输出
  echo ""
done

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

  • 使用while循环
root@localhost demo]# vim chengfabiao.sh 

#!/bin/bash
#外层循环i控制行
i=0
while [ $i -lt 9 ]
do
  let i++
  #内层循环j控制列
  j=0
  #当列数小于行数执行while语句
  while [ $j -lt $i ]
  do
    let j++
    #乘法表的结果为行数代表的值*列数代表的值
    let sum=i*j
#不换行且使用tab制表符进行分隔    
echo -n -e "$j*$i=$sum\t"
  done
#没执行完内层循环就换行输出
echo ""
done
[root@localhost demo]# bash chengfabiao.sh 
1*1=1	
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	

4、输出直线

[root@localhost demo]# vim zhixian.sh

#!/bin/bash
#输出直线
for ((a=1;a<=20;a++))
do
  #不换行输出*
  echo -n "*"
done
#循环结束后换行输出
echo ""
[root@localhost demo]# bash zhixian.sh 
********************

 

5、输出矩形

5.1实心矩形

[root@localhost demo]# vim shixinjuxing.sh 

#!/bin/bash
#外循环控制行
for ((a=1;a<=10;a++))
do
  #内循环控制列
  for ((b=1;b<=20;b++))
  do
  #不换行输出*
  echo -n "*"
  done
  #每次内循环结束后换行输出
  echo ""
done
[root@localhost demo]# bash shixinjuxing.sh 
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************

 

 

5.2空心矩形

[root@localhost demo]# vim kxjx.sh 

#!/bin/bash
#矩形长20,宽10
#空心的,第一行和最后一行输出20个*,其它行先输出一个*再输出18个空格,最后再输出一个*

#控制行数
for ((a=1; a<=10; a++))
do
  #行数为1或者为10的时候  
  if [ $a -eq 1 -o $a -eq 10 ] ; then
    #从第一列到第20列全部输出*
    for ((b=1; b<=20; b++))
    do
      #不换行输出* 
      echo -n "*"
    done
  else    #不是第1列或者第20列的时候就进行下面的操作
    #不换行输出*
    echo -n "*"
    #使用for循环在每一行的*后面输出18个空格
    for c in {1..18}
    do
      echo -n " "
    done
    #在每一行的空格后面输出*
    echo -n "*"
  fi
  #每次的内循环结束后进行换行操作
  echo ""
done
[root@localhost demo]# bash kxjx.sh 
********************
*                  *
*                  *
*                  *
*                  *
*                  *
*                  *
*                  *
*                  *
********************

6、三角形

6.1右直角三角形

与99乘法表思路相同

[root@localhost demo]# vim zysj.sh

#!/bin/bash
#右直角三角形
for ((a=1; a<=9; a++))
do
  for ((b=1; b<=$a; b++))
  do
    echo -n "*"
  done
  echo ""
done
[root@localhost demo]# bash zysj.sh 
*
**
***
****
*****
******
*******
********
*********

 

6.2倒直角三角形

[root@localhost demo]# vim zysj.sh

#!/bin/bash
#倒直角三角形
for ((a=1; a<=9; a++))
do
  for ((b=9; b>=a; b--))
  do
    echo -n "*"
  done
  echo ""
done
[root@localhost demo]# bash zysj.sh 
*********
********
*******
******
*****
****
***
**
*

6.3反直角三角形

[root@localhost demo]# vim zjsj.sh 

#!/bin/bash
#反直角三角形(一个倒空格三角与反直角三角拼凑)

for ((a=1; a<=9; a++))
do
  #生成一个空格填充的倒直角三角形
  for ((b=9; b>=a; b--))
  do
    echo -n " "
  done
  #生成一个*构成的反三角
  for ((c=1; c<=a; c++))
  do
    echo -n "*"
  done
  echo ""
done
[root@localhost demo]# bash zjsj.sh 
         *
        **
       ***
      ****
     *****
    ******
   *******
  ********
 *********

 

6.4等腰三角形

[root@localhost demo]# vim dy.sh
#!/bin/bash
#等腰三角形(空格倒三角+*反三角+*正三角)

for ((a=1; a<=9; a++))
do
  #生成一个空格填充的倒直角三角形
  for ((b=9; b>=a; b--))
  do
    echo -n " "
  done
  #生成一个*构成的反三角
  for ((c=1; c<=a; c++))
  do
    echo -n "*"
  done
  #生成一个*构成的正三角    
  for ((d=2; d<=a; d++))
  do        
    echo -n "*" 
  done     
  echo "" 
done          
[root@localhost demo]# bash dy.sh 
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************

 

方法二:算数法

#!/bin/bash
#等腰三角形(空格倒三角+*反三角+*三角)
for ((a=1; a<=9; a++))
do
  #输出空倒三角
  for ((b=9 ; b>=a; b--))
  do
    echo -n " "
  done
  #计算每行应i该输出几个*
  i=$[(a * 2) - 1] #如第一行输出 1*2-1=1个星
  #输出*
  for ((h=1 ; h<=i ; h++))
  do
    echo -n "*"
  done
  echo ""
done

6.5等腰倒三角

[root@localhost demo]# vim dy.sh 

#!/bin/bash
#等腰三角形(空格直三角+*倒三角+*倒三角)

for ((a=1; a<=9; a++))
do
  #生成一个空格填充的直角三角形
  for ((b=1; b<=a; b++))
  do
    echo -n " "
  done
  #生成一个*构成的倒三角
  for ((c=9; c>=a; c--))
  do
    echo -n "*"
  done      
  #生成一个*构成的倒三角
  for ((d=8; d>=a; d--))
  do        
    echo -n "*" 
  done
  echo ""     
done  
[root@localhost demo]# bash dy.sh 
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *


7、菱形

[root@localhost demo]# vim lx.sh 

#!/bin/bash
#输出菱形

#等腰三角
for ((a=1; a<=9; a++))
do
  #输出空倒三角
  for ((b=9 ; b>=a; b--))
  do
    echo -n " "
  done
  #计算每行应i该输出几个*
  i=$[(a * 2) - 1] #如第一行输出 1*2-1=1个星
  #输出*
  for ((h=1 ; h<=i ; h++))
  do
    echo -n "*"
  done
  echo ""
done

#生成等腰倒三角
for ((a=2; a<=9; a++))
do
  #生成一个空格填充的直角三角形
  for ((b=1; b<=a; b++))
  do
    echo -n " "
  done
  #生成一个*构成的倒三角
  for ((c=9; c>=a; c--))
  do
    echo -n "*"
  done
  #生成一个*构成的倒三角
  for ((d=8; d>=a; d--))
  do
   echo -n "*"
  done
  echo ""
done


[root@localhost demo]# bash lx.sh 
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值