學過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
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循環控制了要打印星號的行數。
打印矩形:5行5列
打印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
#
總結:只要你認真尋找其中的規律,利用其規律可以簡化代碼的行數,利用循環可以輕松的完成你想輸出的形狀。本文中有部分簡單的介紹了代碼的含義,建議初學者閱讀以上代碼范例,明白其實現的原理。
看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170121/92774.html
文章列表