Desenhe um retângulo no bash

Desenhe um retângulo no bash
#!/bin/bash
echo "enter the sizeof the rectangle"
read size
clear
for (( i = 1; i <= size; i++ )); do
for (( j = 1; j <= size; j++ )); do
if [ "$i" == 1 ] || [ "$i" == "$size" ] || [ "$j" == 1 ] || [ "$j" == "$size" ]
then
#statements
tput cup $i $j
echo "*"
fi
done
done

Como posso alterar o código na linha 10 para que ele seja usado echoem vez de tput cup? Estou usando Linux.

Responder1

#!/bin/bash

read -p 'Size: ' sz

topbottom=$(yes '*' | head -n "$sz" | tr -d '\n' )
printf -v midrows '*%*s*' "$((sz-2))" ""

printf '%s\n' "$topbottom"
yes "$midrows" | head -n "$((sz-2))"
printf '%s\n' "$topbottom"

Isso calcula as linhas superior e inferior (elas são iguais) e, em seguida, as linhas do meio (também são iguais). A saída das linhas superior e inferior é então feita com duas printfchamadas, e as linhas do meio são geradas pelo yesutilitário (truncadas para o número correto de linhas).

O *%*s*formato enigmático na printfchamada significa "an *, uma string de largura fornecida pelo próximo argumento e depois outro *". A largura é o tamanho fornecido do retângulo, menos 2, e a string é uma string vazia (será preenchida com espaços).

Perguntas semelhantes:

Responder2

se o seu alvo não fornecer, tputvocê pode usar algo assim:

#!/bin/bash
read -p "enter the size of the rectangle: " size
clear
for (( i = 1; i <= size; i++ )); do
  for (( j = 1; j <= size; j++ )); do
    if (( 1 == i || size == i || 1 == j || size == j )); then
      echo -n "*"
    else
      echo -n " "
    fi
  done
  echo
done

Caso contrário, sua solução já implementada funcionaria bem.

Responder3

Isso faz tudo nos recursos internos do bash: não há necessidade de sim, head, tr, tput ou loops aninhados.

Paul--) cat ./myBox
#! /bin/bash

sz=$(( ${1:-10} - 2 ))

printf -v xBlk '%-*s' ${sz} ''
xAst="${xBlk//?/*}"
xRow="${xAst//?/ x}"

printf '*%s*\n' "${xAst}"
for r in ${xRow}; do printf '*%s*\n' "${xBlk}"; done
printf '*%s*\n' "${xAst}"

Paul--) ./myBox 5
*****
*   *
*   *
*   *
*****
Paul--) 

informação relacionada