需求:列印一個正三角形,要求使用者輸入一個數字n,然後列印邊長為n個*字元的正三角形。
需求分析:
1. 正三角形,即三條邊長度相同,三個角都為60°
2. 腳本需要使用者互動,是以使用read -p實作,關鍵代碼
read -p "Please input a number: " n
3. 正三角形,第一行為1個*,第二行為2個*,第三行為3個*,……以此類推,是以列印的*個數是遞增的。假設n為10,關鍵代碼
n=10
for i in `seq $n`
do
for j in `seq $i`
do
echo -n "*"
done
echo
done
結果如下圖
這段代碼裡,用到了echo -n,這是為了不列印換行符,進而實作第2行裡兩個*連在一起,3行裡3個*連在一起,……
而每行最後面還需要換行,是以腳本裡第8行代碼的echo就是為了列印換行符。
4. 為了讓列印的三角形美觀,每個*後面需要帶一個空格,*和空格就需要兩個字元。假若如此的話,每行的字元都應該是2n個,隻不過第一行除了一個*,其它字元都是空格,第二行除了兩個*外,其它字元都是空格,當然兩個*之間應該有一個空格。
5. 按上面的規律,第一行列印1對“*+空格”,第二行列印兩對“*+空格”,第三行列印三對“*+空格”,……
假設n為10,關鍵代碼如下:
n=10
for i in `seq $n`
do
for j in `seq $i`
do
echo -n "* "
done
echo
done
相比較之前代碼,僅僅是在*後面加了個空格。效果如下圖:
6. 再來說一個關鍵問題,第一行在列印“*+空格”之前,應該先列印n-1個空格,然後再列印*,第二行列印n-2個空格,然後再列印*,第三行列印n-3個空格,然後列印*,……到了第n行也就是最後一行,列印0(n-n)個空格。
假設n為10,關鍵代碼如下:
n=10
for i in `seq $n`
do
for k in `seq $[$n-1] -1 $i`
do
echo -n " "
done
for j in `seq $i`
do
echo -n "* "
done
echo
done
代碼第4行,seq $[$n-1] -1 $i是為了實作倒序隊列,第一次列印9個空格,第二次列印8個空格,第三次列印7個空格,……,第十次列印0個空格。
是以,最終腳本寫出來是這樣的:
#!/bin/bash
read -p "Please input a number: " n
for i in `seq $n`
do
for k in `seq $[$n-1] -1 $i`
do
echo -n " "
done
for j in `seq $i`
do
echo -n "* "
done
echo
done
腳本運作結果如下: