【前言】

练习shell,提高逻辑能力。


【脚本】

三角形与菱形均通过几个for循环实现,当然也可以用while。

下面是脚本内容:

[三角形]

#!/bin/bash
read -p "please input the longs:" long
for((i=1;i<=$long;i++))
do
    for((j=$long;j>i;j--)) #控制空格输出
    do
        echo -n " "
    done
    for m in `seq 1 $i`  #输出所在行数相同的数字个数,如在第三行,就输出3个3
    do
        echo -n "$i"     
    done
    #for((n=1;n<i;n++))
    for n in `seq 2 $i`  #输出所在行数减一的数字个数,如在第三行,就输出2个三
    do                   ##这连个for循环可以整合到一块,实现每行输出(2*所在行数-1)个数字 
        echo -n "$i"
    done
    echo ""
done

执行后的效果图:

wKiom1Z7OtPyCdplAAD7V8yWXAc165.jpg

若将上述脚本内层的两个for循环内"echo -n "$i""的$i换为*后,再次执行脚本效果如下:

wKiom1Z7PIGQigzCAAC2u-DQK04106.jpg


[菱形]

#!/bin/bash
read -p "please input the longs:" long
for((i=1;i<=$long;i++))              #图形上半部分
do
    for((j=$long;j>i;j--))
    do
        echo -n " "
    done
    for m in `seq 1 $i`
    do
        echo -n "*"
    done
    #for((n=1;n<i;n++))
    for n in `seq 2 $i`
    do
        echo -n "*"
    done
    echo ""
done

for((i=2;i<=$long;i++))    #图形下半部分
do
    for ((j=1;j<i;j++))
    do
        echo -n " "
    done

    let k=$long+1-$i    

    for m in `seq 1 $k`
    do
        echo -n "*"
    done
    for ((n=1;n<k;n++))
    #for n in `seq 2 $k`
    do
        echo -n "*"
    done
    echo ""
done

改进后:

#!/bin/bash
read -p "please input the longs:" long
for((i=1;i<=$long;i++))       #控制行数
do
    for((j=$long;j>i;j--))    #控制空格输出
    do
        echo -n " "
    done
    
    let "g=2*i-1"

    for m in `seq 1 $g`       #控制*数量
    do
        echo -n "*"
    done

    echo ""
done

for((i=2;i<=$long;i++))       #控制行数
do
    for ((j=1;j<i;j++))       #控制空格输出
    do
        echo -n " "
    done

    let "k=2*(long-i)+1"

    for m in `seq 1 $k`       #控制*数量
    do
        echo -n "*"
    done

    echo ""
done

执行后的效果图:

wKiom1Z7RTLiRun4AADRWz-0eH4083.jpg