Zeichnen Sie ein Rechteck in Bash

Zeichnen Sie ein Rechteck in 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

Wie kann ich den Code in Zeile 10 ändern, sodass er echoanstelle von verwendet tput cup? Ich verwende Linux.

Antwort1

#!/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"

Dabei werden die oberen und unteren Zeilen berechnet (sie sind gleich) und dann die mittleren Zeilen (diese sind ebenfalls gleich). Die Ausgabe der oberen und unteren Zeilen erfolgt dann mit zwei printfAufrufen, und die mittleren Zeilen werden vom yesDienstprogramm ausgegeben (auf die richtige Zeilenanzahl gekürzt).

Das kryptische *%*s*Format im printfAufruf bedeutet „ein *, ein String mit der Breite, die durch das nächste Argument gegeben ist, und dann noch eins *“. Die Breite ist die angegebene Größe des Rechtecks ​​minus 2, und der String ist ein leerer String (er wird mit Leerzeichen aufgefüllt).

Ähnliche Fragen:

Antwort2

Wenn Ihr Ziel dies nicht bereitstellt, tputkönnen Sie Folgendes verwenden:

#!/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

Ansonsten wäre Ihre bereits implementierte Lösung ausreichend.

Antwort3

Dies erledigt die gesamte Aufgabe in integrierten Bash-Funktionen: Keine Notwendigkeit für „yes“, „head“, „tr“, „tput“ oder verschachtelte Schleifen.

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--) 

verwandte Informationen