shell编程之双重循环(教你花式打印各种图形)

1,369 阅读4分钟

1、双重循环概述

  1. 双重循环需要具备的前提——存在两个以上的自变量。

  2. 执行机制:

    • 循环必须是有规律的递增或递减,脚本从上至下执行。
    • 在没有break、exit、continue等结束语句时,循环语句会逐条执行。外层循环每执行一次,内层循环都要全部执行完毕,下一次外层循环才能再执行。
    • 可以把内层循环,看作外层循环的一个命令语句。

双重循环演示:

外层循环5次,内层循环5次。

 [root@localhost ~]# vim shuang.sh
 #!/bin/bash
 #双层循环
 ​
 #外层循环
 for ((i=1;i<=5;i++))
 do
    echo "outer loop:$i"
 #内层循环
    for ((j=1;j<=5;j++))
    do
       echo "   inner loop:$j"
    done
 done

1.png

1-2.png

2、shell脚本退出循环语句

2.1 exit

exit的作用:

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

示例:

在内层循环的输出语句上方,增加 if 语句判断,当内存循环到达第三次时,执行exit退出脚本。

效果:外层循环只执行1次,内存循环只执行2次。

 #!/bin/bash
 #双层循环
 ​
 #外层循环
 for ((i=1;i<=5;i++))
 do
    echo "outer loop:$i"
 #内层循环
    for ((j=1;j<=5;j++))
    do
 #当内层循环到达第三次时,exit退出脚本
       if [ $j -eq 3 ]
       then
            exit
       fi
       echo "   inner loop:$j"
    done
 done

2 exit1.png

2 exit2.png

2.2 break

break的作用:

  • 跳出单层循环,默认为break 1,后面的数字为跳出层数。例如"break 2"为跳出2层循环。
  • 循环内break之后的语句都不会执行,但循环外的语句仍然会执行。

示例:

在内层循环的输出语句上方,增加 if 语句判断,当内存循环到达第三次时,执行break跳出内层循环。

效果:外层循环5次,内存循环2次。(内层循环每到达第3次时,就跳出内层循环,执行下一次外层循环。)

 #!/bin/bash
 #双层循环
 ​
 #外层循环
 for ((i=1;i<=5;i++))
 do
    echo "outer loop:$i"
 #内层循环
    for ((j=1;j<=5;j++))
    do
 #当内层循环到达第三次时,break跳出内层循环
       if [ $j -eq 3 ]
       then
            break
       fi
       echo "   inner loop:$j"
    done
 done

2 break1.png

2 break2.png

2.3 continue

continue的作用:

  • 终止某次循环的执行,本次循环continue后面的语句不会执行,但不会完全终止整个循环。就是直接跳过满足条件的循环,即满足条件的不执行。
  • continue一般用于for循环。在while和until中要慎用,因为如果变量迭代语句放在continue之后,那么迭代不会执行,会造成死循环。

示例:

在内层循环的输出语句上方,增加 if 语句判断,当内存循环到达第三次时,执行continue跳出本次循环。

效果:外层循环5次,内存循环跳过第3次,执行第1、2、4、5次。

 #!/bin/bash
 #双层循环
 ​
 #外层循环
 for ((i=1;i<=5;i++))
 do
    echo "outer loop:$i"
 #内层循环
    for ((j=1;j<=5;j++))
    do
 #当内层循环到达第三次时,continue跳过本次循环
       if [ $j -eq 3 ]
       then
            continue
       fi
       echo "   inner loop:$j"
    done
 done

2 continue1.png

2 continue2.png

3、使用双重循环花式打印图形

外层循环用于表示行数。

内层循环用于表示列数。

图形1:实心矩形

每一行打印20个星星,一共打印10行。

 #!/bin/bash
 #矩形,长20,宽10
 ​
 for a in {1..10}
 do
    for b in {1..20}
    do
 #-n表示不换行
       echo -n "*"
    done
 #这里的echo用于换行,因为echo默认会打印换行符
    echo " "
 done
 
 [root@yuji sh]# bash hua1.sh
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************

3 实心矩形1.png

3实心矩形2.png

图形2:空心矩形

步骤1:第1行和第10行,输出20个星星。

步骤2:第2~9行,输出1个星星。再输出18个空格。最后再输出1个星星。

 #!/bin/bash
 #空心矩形,长20,宽10
 #一共10行,第1行和第10行输出20个星星
 #其他行输出1个星星,再输出18个空格,最后再输出1个星星
 ​
 for a in {1..10}
 do
    #第1行和第10行,输出20个星星
    if [ $a -eq 1 -o $a -eq 10 ]
    then
        for b in {1..20}
        do
          echo -n "*"
        done
    else
        #其他行输出1个星星
        echo -n "*"
        #再输出18个空格
        for c in {1..18}
        do
           echo -n " "
        done
        #最后再输出1个星星
        echo -n "*"
    fi
    #用于换行,echo默认会打印换行符
    echo " "
 done
 
 [root@yuji sh]# bash hua2.sh
********************
*                  *
*                  *
*                  *
*                  *
*                  *
*                  *
*                  *
*                  *
********************

4空心矩形1.png

4空心矩形2.png

图形3:直角三角形

第一行输出1个星星,

第二行输出2个星星,

第三行输出3个星星,

以次类推,

直到第九行输出9个星星。

方法一:

 #!/bin/bash
 #显示直角三角形
 #a从1开始
 ​
 for a in {1..9}
 do
    for b in `seq $b`
    do
 #-n表示不换行
       echo -n "*"
    done
 #用于换行,echo默认打印换行符
    echo
 done
 
 
[root@yuji sh]# bash hua30.sh
*
**
***
****
*****
******
*******
********
*********

5直角三角形1.png

5直角三角形1-1.png

方法二:

 #!/bin/bash
 #显示直角三角形
 #a从9开始
 ​
 for a in {9..1}
 do
    for ((b=9;b>=a;b--))
    do
 #-n表示不换行
       echo -n "*"
    done
 #用于换行,echo默认打印换行符
    echo
 done

5直角三角形2.png

5直角三角形3.png

图形4:倒直角三角形

第一行打印9个星星;

第二行打印8个星星;

第三行打印7个星星;

以此类推,

直到第九行打印1个星星。

方法一:

 #!/bin/bash
 #显示倒直角三角形
 #a从1开始
 ​
 for a in {1..9}
 do
    for ((b=9;b>=a;b--))
    do
       echo -n "*"
    done
    echo
 done
 
 [root@yuji sh]# bash hua4.sh
*********
********
*******
******
*****
****
***
**
*

6倒直角三角形1-1.png

6倒直角三角形1-2.png

方法二:

 #!/bin/bash
 #显示倒直角三角形
 #a从9开始
 ​
 for a in {9..1}
 do
    for ((b=1;b<=a;b++))
    do
 #-n表示不换行
       echo -n "*"
    done
 #echo用于换行,因为echo默认会打印换行符
    echo
 done

图形5:反直角三角形

先输出一个空格填充的倒直角三角形,再输出一个星星填充的直角三角形。

 #!/bin/bash
 #反直角三角形
 #先生成一个空格填充的倒直角三角形
 #再生成一个星星填充的直角三角形
 #a从9开始
 ​
 for a in {9..1}
 do
 #生成一个空格填充的倒直角三角形
    for ((b=1;b<=a;b++))
    do
       echo -n " "
    done
 #再生成一个星星填充的直角三角形
    for ((c=9;c>=a;c--))
    do
       echo -n "*"
    done
 #用于换行,echo默认打印换行符
    echo
 done
 
 [root@yuji sh]# bash hua5.sh
         *
        **
       ***
      ****
     *****
    ******
   *******
  ********

7 反直角三角形.png

7 反直角三角形2.png

图形6:等腰三角形

方法一:

反直角三角形+正直角三角形

 #!/bin/bash
 #等腰三角形
 #通过"反直角三角形+正直角三角形"的方式生成
 ​
 for a in {9..1}
 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默认打印换行符
    echo
 done
 
[root@yuji sh]# bash hua06.sh
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************

8等腰三角形1-1.png

8等腰三角形1-2.png

方法二:

先输出一个空格填充的倒直角三角形;之后输出每行的星星,每行的星星个数=行数×2-1。

 #!/bin/bash
 #等腰三角形
 #先输出一个空格填充的倒直角三角形
 #之后每行的星星个数=行数×2-1
 ​
 for a in {1..9}
 do
 #输出一个空格填充的倒直角三角形
    for ((b=9;b>=a;b--))
    do
       echo -n " "
    done
 #每行的星星个数=2a-1
    i=$[(a*2)-1]
    for j in `seq $i`
    do
       echo -n "*"
    done
 #用于换行,echo默认打印换行符
    echo
 done

8等腰三角形2-1.png

8等腰三角形2-2.png

图形7:倒等腰三角形

方法一:

先输出一个空格直角三角形,再输出一个星星填充的反直角三角形,最后输出一个星星填充的倒直角三角形。

 #!/bin/bash
 #倒等腰三角形
 #先输出一个空格直角三角形
 #再输出一个星星填充的反直角三角形
 #最后输出一个星星填充的倒直角三角形
 ​
 for a in {1..9}
 do
 #输出一个空格填充的直角三角形
    for b in `seq 1 $a`
    do
       echo -n " "
    done
 #再输出一个星星填充的反直角三角形
    for c in `seq $a 9`
    do
       echo -n "*"
    done
 #最后输出一个星星填充的倒直角三角形
    for d in `seq $a 8`
    do
       echo -n "*"
    done
 #用于换行,echo默认打印换行符
    echo
 done
 
 
[root@yuji ~]# bash hua7.sh
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

9倒等腰三角形1-1.png

9倒等腰三角形1-2.png

方法二:

 #!/bin/bash
 #倒等腰三角形
 #a从9开始
 #先输出一个空格直角三角形
 #之后每行的星星个数=2a-1
 ​
 for a in {9..1}
 do
 #输出一个空格填充的直角三角形
    for ((b=9;b>=a;b--))
    do
       echo -n " "
    done
 #每行的星星个数=2a-1
    i=$[(a*2)-1]
    for j in `seq $i`
    do
       echo -n "*"
    done
 #用于换行,echo默认打印换行符
    echo
 done

9倒等腰三角形2-1.png

9倒等腰三角形2-2.png

图形8:菱形(正等腰三角形+倒等腰三角形)

先输出一个正等腰三角形(9行);再输出一个倒等腰三角形(8行)。

 #!/bin/bash
 #菱形
 #正等腰三角形+倒等腰三角形
 ​
 #正等腰三角形,一共9行
 for a in {1..9}
 do
 #输出一个空格填充的倒直角三角形
    for ((b=9;b>=a;b--))
    do
       echo -n " "
    done
 #每行的星星个数=2a-1
    i=$[(a*2)-1]
    for j in `seq $i`
    do
       echo -n "*"
    done
    echo
 done
 ​
 #倒等腰三角形,一共8行
 for a in {8..1}
 do
    for ((b=9;b>=a;b--))
    do
       echo -n " "
    done
 #每行的星星个数=2a-1
    i=$[(a*2)-1]
    for j in `seq $i`
    do
       echo -n "*"
    done
    echo
 done
 
 
 [root@yuji ~]# bash hua8.sh
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

10菱形1.png

10菱形2.png

图形9:平行四边形

方法一:

先输出一个空格填充的直角三角形,之后每行输出相同个数的星星。

 #!/bin/bash
 #平行四边形
 #先输出一个空格填充的直角三角形
 #之后每行输出相同个数的星星
 ​
 for a in {1..9}
 do
 #输出一个空格直角三角形
    for b in `seq 1 $a`
    do
       echo -n " "
    done
 #每行输出9个星星
    for c in {1..9}
    do
       echo -n "*"
    done
    echo
 done
 
 [root@yuji ~]# bash hua9.sh
 *********
  *********
   *********
    *********
     *********
      *********
       *********
        *********
         *********

11平行四边形1-1.png

11平行四边形1-2.png

方法二:

先输出一个空格填充的倒直角三角形,之后每行输出相同个数的星星。

 #!/bin/bash
 #平行四边形
 #先输出一个空格填充的直角三角形
 #之后每行输出相同个数的星星
 ​
 for a in {1..9}
 do
 #输出一个空格直角三角形
    for b in `seq $a 9`
    do
       echo -n " "
    done
 #每行输出9个星星
    for c in {1..9}
    do
       echo -n "*"
    done
    echo
 done
 
[root@yuji ~]# bash hua09.sh
         *********
        *********
       *********
      *********
     *********
    *********
   *********
  *********
 *********

11平行四边形2-1.png

11平行四边形2-2.png

图形10:直角梯形

将平行四边形左边的空格直角三角形,变成星星直角三角形。

 #!/bin/bash
 #直角梯形
 #使用"直角三角形+平行四边形"的方式
 ​
 for a in {1..9}
 do
 #输出一个星星填充的直角三角形
    for b in `seq 1 $a`
    do
       echo -n "*"
    done
 #每行输出9个星星
    for c in {1..9}
    do
       echo -n "*"
    done
    echo
 done
 
[root@yuji ~]# bash hua10.sh
**********
***********
************
*************
**************
***************
****************
*****************
******************

12直角梯形1.png

12直角梯形2.png

图形11:等腰梯形

先输出一个空格填充的倒直角三角形;之后输出每行的星星,每行的星星个数=n+行数×2(n为任意正整数,每一行的星星个数都比上一行多2个)。

 #!/bin/bash
 #等腰梯形
 #先输出一个空格填充的倒直角三角形(9行)
 #每行的星星个数=9+行数×2
 ​
 for a in {1..9}
 do
 #输出一个空格填充的倒直角三角形
    for ((b=9;b>=a;b--))
    do
       echo -n " "
    done
 #每行输出(9+2a)个星星
    i=$[9+a*2]
    for ((c=1;c<=i;c++))
    do
       echo -n "*"
    done
    echo
 done
 
 [root@yuji ~]# bash hua11.sh
         ***********
        *************
       ***************
      *****************
     *******************
    *********************
   ***********************
  *************************
 ***************************

13等腰梯形1.png

13等腰梯形2.png