#!/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"
これは、上と下の行 (同じ) を計算し、次に中央の行 (これも同じ) を計算します。上と下の行の出力は 2 回の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--)