在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?我正在使用Linux。

答案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意味著「一個*,一個由下一個參數給出的寬度字串,然後是另一個*」。寬度是矩形的給定大小減 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--) 

相關內容