Como posso adicionar * no meio da caixa que é criada por este script bash?

0

Como posso adicionar um * no meio da caixa que é criada por este script bash?

#!/bin/bash
#
# raami joonistamine
echo -n "sisesta ridade arv: "
read rida
echo -n "sisesta tärnide arv: "
read tarn
# genereeri rea numbrid
for ((i = 1; i <= $rida;i++))
do
    echo -n "$i "
    # kui on esimene või viimane rida
    if [ $i -eq 1 -o $i -eq $rida ]; then
    # tärnidest tulev rida
    for((j = 1; j <=$tarn; j++))
    do
        echo -n "* "
    done
# teised read
    else
        echo -n "* "
        # tühikud
        for((j = 2; j < $tarn;j++))
        do
            echo -n "  "
        done
    echo -n "* "
    fi
    echo
done
    
por Juhan 25.05.2018 / 07:42

1 resposta

0

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
    
por 25.05.2018 / 08:41

Tags