Linuxshell脚本 · 2022年10月24日 0

Shell脚本习题–打印三角形

需求:打印一个正三角形,要求用户输入一个数字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 `seqi`
    do
        echo -n "*"
    done
    echo
    done

    结果如下图

    这段代码里,用到了echo -n,这是为了不打印换行符,从而实现第2行里两个连在一起,3行里3个连在一起,……

而每行最后面还需要换行,所以脚本里第8行代码的echo就是为了打印换行符。

  1. 为了让打印的三角形美观,每个后面需要带一个空格,和空格就需要两个字符。假若如此的话,每行的字符都应该是2n个,只不过第一行除了一个,其它字符都是空格,第二行除了两个外,其它字符都是空格,当然两个*之间应该有一个空格。

  2. 按上面的规律,第一行打印1对“+空格”,第二行打印两对“+空格”,第三行打印三对“*+空格”,……

假设n为10,关键代码如下:

n=10
for i in `seq n`
do
    for j in `seqi`
    do
        echo -n "* "
    done
    echo
done

相比较之前代码,仅仅是在*后面加了个空格。效果如下图:

  1. 再来说一个关键问题,第一行在打印“+空格”之前,应该先打印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] -1i`
    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] -1i`
    do
        echo -n " "
    done

    for j in `seq $i`
    do
        echo -n "* "
    done
    echo
done

脚本运行结果如下: