#!/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
¿Cómo puedo cambiar el código en la línea 10 para que use echo
en lugar de tput cup
? Estoy usando Linux.
Respuesta1
#!/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"
Esto calcula las filas superior e inferior (son iguales) y luego las filas del medio (también son iguales). Luego, la salida de las filas superior e inferior se realiza con dos printf
llamadas, y la utilidad genera las filas del medio yes
(truncadas al número correcto de líneas).
El formato críptico *%*s*
en la printf
llamada significa "an *
, una cadena de ancho dada por el siguiente argumento, y luego otra *
". El ancho es el tamaño dado del rectángulo, menos 2, y la cadena es una cadena vacía (se rellenará con espacios).
Preguntas similares:
Respuesta2
Si su objetivo no proporciona, tput
puede usar algo como esto:
#!/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
De lo contrario, su solución ya implementada estaría bien.
Respuesta3
Esto hace todo en las funciones integradas de bash: no es necesario yes, head, tr, tput o bucles anidados.
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--)