#!/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 echo
anstelle 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 printf
Aufrufen, und die mittleren Zeilen werden vom yes
Dienstprogramm ausgegeben (auf die richtige Zeilenanzahl gekürzt).
Das kryptische *%*s*
Format im printf
Aufruf 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, tput
kö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--)