Altere seu loop mais interno:
# tühikud
for((j = 2; j < $tarn;j++))
do
echo -n " "
done
para
# tühikud
for((j = 2; j < $tarn;j++))
do
if [ "$i" -eq "$(( (rida+1) / 2 ))" ] && [ "$j" -eq "$(( (tarn+1) / 2 ))" ]; then
echo -n '* '
else
echo -n " "
fi
done
Ou seja, quando você detectar que está prestes a exibir o caractere intermediário, insira um *
em vez de um espaço.
Para um posicionamento um pouco mais preciso na linha:
# tühikud
for((j = 2; j < $tarn;j++))
do
if [ "$i" -eq "$(( (rida+1) / 2 ))" ] && [ "$j" -eq "$(( (tarn+1) / 2 ))" ]; then
if [ "$(( tarn%2 ))" -eq 0 ]; then
echo -n ' *'
else
echo -n '* '
fi
else
echo -n " "
fi
done
Em vez de gerar caracteres únicos, imprima uma linha inteira de uma só vez. Isso é mais eficiente, e você só tem três tipos de linhas que importa: linhas superior / inferior, linha do meio e outras linhas:
#!/bin/bash
read -r -p 'Height: ' rows
read -r -p 'Width : ' cols
topbottom=$( yes '*' | head -n "$cols" | tr '\n' ' ' )
midrow=$( printf '*%*s*%*s*' "$(( cols - 2 ))" "" "$(( cols - 2 ))" "" )
otherrows=$( printf '*%*s*' "$(( 2*(cols - 2) + 1 ))" "" )
for (( row = 0; row < rows; ++row )); do
if (( row == 0 )) || (( row == rows - 1 )); then
thisrow=$topbottom
elif (( row == rows / 2 )); then
thisrow=$midrow
else
thisrow=$otherrows
fi
printf '%2d %s\n' "$(( ++n ))" "$thisrow"
done