Shell学习·for循环实例演练

简介:

学过C语言的同学,是否还记得当年各种打印各种星星。今天,我就改一版使用Shell脚本输出各种星星。

打印单个星号

         这个没啥可说的,直接上代码:

# cat star.sh

#!/bin/bash

echo "*"

# ./star.sh

*

#

执行后的结果表明,Linuxecho命令打印“*”后会自动换行。无论你在一行中输入几个星号,执行到最后一个星号都会自动换行。

打印多行星号

         如果想同时在多行中打印星星,例如:每行打印一个打印三行。很明显,实现这个需要重复执行相同的操作来完成,使用循环结构就可以很轻松的解决该问题。

         Shell 中,循环结构可以使用forwhile、和until 等语句来实现。还可以使用continuebreak 等语句来在适当的时机跳过或者退出循环体中的某些语句。for循环是最简单,也是最常用的循环语句。本例中我们使用for循环来实现。

         我们多数使用for循环时候,经常使用“带列表的for循环语句”和“类C语言风格的for循环”,首先,介绍下带列表的for循环语句的语法:

for  variable in {list}

do

command1

command2

...

done

在上面的语法中,variable 称为循环变量,list 是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do done 之间的所有的语句称为循环体,即循环结构中重复执行的语句。for 循环体的执行次数与list 中元素的个数有关。

         带列表的for 语句执行时,Shell 会将in 关键字后面的list 列表的第1 个元素的值赋给变量variable,然后执行循环体;当循环体中的语句执行完毕之后,Shell 会将列表中的下1个元素的值赋给变量variable,然后再次执行循环体。当list 列表中的所有的元素都被访问后,for 循环结构终止,程序将继续执行done语句后面的其他语句。

         对于LIST的用法,常用的有以下几种:

         ·直接写:例如:1 2 3

         ·大括号:例如:{1..3}

         ·字符串:例如:a b c

         ·文件名  例如:/etc/*.conf

         ·命令执行结果:例如:$(find /etc -name "*.conf")

         ·使用脚本的位置参数:例如:$N$*

C语言风格的for循环的语法:

for  ((expression1; expression2; expression3));do

command1

command2

...

done

在上面的语法中,for循环语句的条件被两个小括号包起来。执行条件分为3部分,由两个分号隔开,第一部分expression1通常是条件变量的初始化语句,第二部分expression2是决定是否执行for循环的条件。当expression2的值为0时,执行整个循环体,当expression2的值为非0时,退出for循环体。第三部分expression3通常用来改变条件变量的值,例如递增或递减等。

         对于(()) 的用法,例如以下几种:

         ·((i=1;i<=5;i++ )) :递增1

         ·(( i=5;i>=1;i--)) :递减1

         ·(( i=1;i<=7;i=i+2)):递增2

         ·((i=$i;i<=$(($i-1));i++)) :数学运算

在我们大致了解了for循环的语法后,我们实现“每行打印一个打印三行”:

*

*

*

代码如下:

#!/bin/bash

for (( i=1;i<4;i++ ));do

   echo "*"

done

#

上述代码中,我们主要使用for循环控制了要打印星号的行数。

打印矩形:55

打印5行5列如下所示:

*****

*****

*****

*****

*****

         实现思路:

        主要是使用for循环嵌套,一个for用来定义一行打印for的个数,另一个for定义打印的行数。其中echo-n参数,主要是为了改变echo默认输入完毕后自动换行,也就是不要在最后自动换行。这样是为了实现连续打印星号。

  代码如下:

# cat star.sh

#!/bin/bash

for (( i=1;i<=5;i++ ));do

   for (( star=1;star<=5;star++ ));do

     echo -n "*"

   done

   echo

done

#

打印正三角形

打印正三角形如下所示:

*

**

***

****

*****

         实现思路:

        还是for循环嵌套,一个for用来定义打印的行数,另一个for循环定义每行要打印信号的个数,并且是递增的方式。

# cat ./star.sh

#!/bin/bash

height=$1

for ((i=1;i<=$height;i++))

do

   for ((star=1;star<=$i;star++))

   do

     echo -n  "*"

   done

   echo ""

done

#

打印倒三角形

打印倒三角形如下所示:

*****

****

***

**

*

         实现思路:

        还是for循环嵌套,一个for用来定义打印的行数,另一个for循环定义每行要打印信号的个数,并且是递减的方式。

   代码如下:

# cat star.sh

#!/bin/bash

height=$1

for ((i=$height;i>=1;i--))

do

   for ((star=1;star<=$i;star++))

   do

     echo -n  "*"

   done

   echo ""

done

#

打印不一样的三角形

(1)

  *

  **

 ***

****

*****

代码如下:

# cat star.sh

#!/bin/bash

height=$1

for ((i=1;i<=$height;i++))

do

   for ((blank=$i;blank<=$(($height-1));blank++))

   do

     echo -n " "

   done

   for ((star=1;star<=$i;star++))

   do

     echo -n  "*"

   done

   echo ""

done

#

(2)

     *

    ***

   *****

 *******

*********

代码如下:

# cat star.sh

#!/bin/bash

height=$1

for ((i=1;i<=$height;i++))

do

   for ((blank=1;blank<=$(($height-$i));blank++))

   do

     echo -n " "

   done

   for ((star=1;star<=$(($i*2-1));star++))

   do

     echo -n  "*"

   done

   echo ""

done

#

(3)

*********

 *******

   *****

    ***

     *

代码如下:

# cat star.sh

#!/bin/bash

height=$1

for ((i=$height;i>=1;i--))

do

   for ((blank=1;blank<=$(($height-$i));blank++))

   do

     echo -n " "

   done

   for ((star=1;star<=$(($i*2-1));star++))

   do

     echo -n  "*"

   done

   echo ""

done

#

 

打印平行四边形

打印平行四边形如下所示:

      *****

     *****

    *****

   *****

 *****

代码如下:

# cat star.sh

#!/bin/bash

height=$1

for (( i=$height;i>=1;i-- ));do

   for (( blank=1;blank<=$i;blank++ ));do

     echo -n " "

   done

   for (( star=1;star<=$height;star++ ));do

     echo -n "*"

   done

   echo

done

#

打印菱形

打印菱形如下所示:

     *

    ***

   *****

 *******

*********

 *******

   *****

    ***

     *

代码如下:

# cat star.sh

#!/bin/bash

height=$1

for ((i=1;i<=$height;i++))

do

   for ((blank=1;blank<=$(($height-$i));blank++))

   do

     echo -n " "

   done

   for ((star=1;star<=$(($i*2-1));star++))

   do

     echo -n  "*"

   done

   echo ""

done

for ((i=$(($height-1));i>=1;i--))

do

   for ((blank=1;blank<=$(($height-$i));blank++))

   do

     echo -n " "

   done

   for ((star=1;star<=$(($i*2-1));star++))

   do

     echo -n  "*"

   done

   echo ""

done

#

        总结:只要你认真寻找其中的规律,利用其规律可以简化代码的行数,利用循环可以轻松的完成你想输出的形状。本文中有部分简单的介绍了代码的含义,建议初学者阅读以上代码范例,明白其实现的原理。





本文转自yjlsy 51CTO博客,原文链接:http://blog.51cto.com/baidu/1882614,如需转载请自行联系原作者


相关文章
|
16天前
|
存储 运维 Shell
shell中for while until 三种循环的用法
shell编程中,有几种常见的循环结构,包括for循环、while循环和until循环,总的来说,循环shell编程中扮演着至关重要的角色,它们使得自动化任务变得更加容易,提高了效率,并且可以处理各种各样的编程需求。
shell中for while until 三种循环的用法
|
3月前
|
Shell 开发工具
学习简单的shell script
【1月更文挑战第3天】学习简单的shell script。
48 3
|
3月前
|
Java 大数据 Shell
Shell基础学习---2、运算符、条件判断、流程控制(第一天学习)
大数据开发学习 Shell基础学习---2、运算符、条件判断、流程控制
38 1
|
3月前
|
监控 Linux Shell
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地定位和解决线上问题,提高系统的稳定性和性能。让我们一同进入这个学习过程吧!
43 0
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
|
1天前
|
运维 Shell Python
Shell和Python学习教程总结
Shell和Python学习教程总结
|
17天前
|
Shell
shell学习(六) 【case多条件分支语句】
shell学习(六) 【case多条件分支语句】
11 1
|
17天前
|
Shell 应用服务中间件 nginx
shell学习(七) 【shell 函数】
shell学习(七) 【shell 函数】
8 1
|
17天前
|
Shell Perl
shell学习(九) 【shell sed用法】
shell学习(九) 【shell sed用法】
8 0
|
17天前
|
Shell 应用服务中间件 开发工具
shell 学习(二) shell语法【特殊字符、转义字符、shell 字体颜色和字体背景】
shell 学习(二) shell语法【特殊字符、转义字符、shell 字体颜色和字体背景】
11 0
|
2月前
|
Shell
shell脚本for循环复杂用法
shell脚本for循环复杂用法
46 5