![在bash中画一个矩形](https://linux22.com/image/170687/%E5%9C%A8bash%E4%B8%AD%E7%94%BB%E4%B8%80%E4%B8%AA%E7%9F%A9%E5%BD%A2.png)
#!/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--)