Bash에서 직사각형 그리기

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

10행의 코드를 echo대신 사용하도록 어떻게 변경합니까 tput cup? 저는 리눅스를 사용하고 있습니다.

답변1

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

이는 위쪽 및 아래쪽 행(동일함)을 계산한 다음 중간 행(이것들도 동일함)을 계산합니다. 그런 다음 위쪽 및 아래쪽 행의 출력은 두 번의 printf호출로 수행되고 중간 행은 yes유틸리티에 의해 출력됩니다(올바른 행 수로 잘림).

*%*s*호출 의 비밀 형식은 printf"an *, 다음 인수로 제공되는 너비의 문자열, 그리고 또 다른 *"를 의미합니다. 너비는 주어진 직사각형 크기에서 2를 뺀 값이고 문자열은 빈 문자열입니다(공백으로 채워집니다).

유제:

답변2

대상이 제공하지 않으면 tput다음과 같이 사용할 수 있습니다.

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

그렇지 않으면 이미 구현된 솔루션이 괜찮을 것입니다.

답변3

이것은 bash 내장 기능에서 모든 작업을 수행합니다. yes, head, tr, tput 또는 중첩 루프가 필요하지 않습니다.

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

관련 정보