天天看點

Shell學習·for循環執行個體演練

學過C語言的同學,是否還記得當年各種列印各種星星。今天,我就改一版使用Shell腳本輸出各種星星。

列印單個星号

         這個沒啥可說的,直接上代碼:

# cat star.sh

#!/bin/bash

echo "*"

# ./star.sh

*

#

執行後的結果表明,Linux的echo指令列印“*”後會自動換行。無論你在一行中輸入幾個星号,執行到最後一個星号都會自動換行。

列印多行星号

         如果想同時在多行中列印星星,例如:每行列印一個列印三行。很明顯,實作這個需要重複執行相同的操作來完成,使用循環結構就可以很輕松的解決該問題。

         在Shell 中,循環結構可以使用for、while、和until 等語句來實作。還可以使用continue和break 等語句來在适當的時機跳過或者退出循環體中的某些語句。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

在上面的文法中,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循環的文法後,我們實作“每行列印一個列印三行”:

代碼如下:

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

   echo "*"

上述代碼中,我們主要使用for循環控制了要列印星号的行數。

列印矩形:5行5列

列印5行5列如下所示:

*****

         實作思路:

        主要是使用for循環嵌套,一個for用來定義一行列印for的個數,另一個for定義列印的行數。其中echo的-n參數,主要是為了改變echo預設輸入完畢後自動換行,也就是不要在最後自動換行。這樣是為了實作連續列印星号。

  代碼如下:

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

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

     echo -n "*"

   done

   echo

列印正三角形

列印正三角形如下所示:

**

***

****

        還是for循環嵌套,一個for用來定義列印的行數,另一個for循環定義每行要列印信号的個數,并且是遞增的方式。

# cat ./star.sh

height=$1

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

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

   do

     echo -n  "*"

   echo ""

列印倒三角形

列印倒三角形如下所示:

        還是for循環嵌套,一個for用來定義列印的行數,另一個for循環定義每行要列印信号的個數,并且是遞減的方式。

   代碼如下:

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

列印不一樣的三角形

(1)

  *

  **

 ***

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

     echo -n " "

(2)

     *

    ***

   *****

 *******

*********

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

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

(3)

列印平行四邊形

列印平行四邊形如下所示:

      *****

     *****

    *****

 *****

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

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

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

列印菱形

列印菱形如下所示:

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

        總結:隻要你認真尋找其中的規律,利用其規律可以簡化代碼的行數,利用循環可以輕松的完成你想輸出的形狀。本文中有部分簡單的介紹了代碼的含義,建議初學者閱讀以上代碼範例,明白其實作的原理。

本文轉自yjlsy 51CTO部落格,原文連結:http://blog.51cto.com/baidu/1882614,如需轉載請自行聯系原作者

繼續閱讀