これは私にはうまくいくようです。「列」引数には奇数をお勧めします。列 = 2*行 - 1 の場合が最もきれいに見えます。コード内の最も長い行は、特定の行に表示する星の数を計算するために使用される基本的な代数、特に線形補間を実行します。
#!/bin/bash
# Christmas tree ASCII drawer
# works nicest for odd integers
spaces() {
for ((i=0; i<$1; i++)) ; do
echo -n " "
done
}
stars() {
for ((i=0; i<$1; i++)) ; do
echo -n "*"
done
echo ""
}
display_tree() {
local rows=$1
local columns=$2
# render
for (( r=1; r <= $rows; r++ )); do
s=$(( (((columns-1) * (r-1)/(rows-1) + 1)/2)*2 +1 ))
spaces $(((columns-s)/2))
stars $s
done
}
if [ $# -eq 2 ]; then
display_tree $1 $2
else
echo "Usage: $0 rows columns"
fi
出力例:
./display_tree.sh 5 21
*
*******
***********
*****************
*********************
./display_tree.sh 30 59
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
*********************
***********************
*************************
***************************
*****************************
*******************************
*********************************
***********************************
*************************************
***************************************
*****************************************
*******************************************
*********************************************
***********************************************
*************************************************
***************************************************
*****************************************************
*******************************************************
*********************************************************
***********************************************************