如何在BASH中为单词数组生成自适应对齐的星号边框
核心错误点
你写的#write array部分存在两个逻辑问题:
echo "* $txt "执行后会自动换行,后续输出的空格和星号会跑到下一行,无法拼接成完整的一行内容printf "*"被写在了空格填充的循环内部,每输出一个空格就会多打一个星号,不符合每行仅首尾各一个星号的要求
修正方案
方案1:保留你原有循环逻辑的修改
只需要调整#write array部分的代码即可:
#write array echo for txt in ${words[@]}; do space=$(($numchar-${#txt})) s=0 # 用printf输出不自动换行的前缀 printf "* $txt " # 只在循环里打印空格,不打星号 while [ $s -lt $space ]; do printf " " ((s++)) done # 空格补完后再打印行尾的星号和换行 printf "*\n" done
方案2:更简洁的优化写法
利用Bash内置的printf格式化能力,可以省去手动循环算空格的步骤,完整代码如下:
# 计算最长单词长度 words=("Hello" "World" "good" "etceter") numchar=0 for i in "${words[@]}"; do if (( ${#i} > numchar )); then numchar=${#i} fi done # 打印顶部边框:总宽度为最长单词长度+4(左右各1个空格+2个星号) printf '%*s\n' $((numchar + 4)) '' | tr ' ' '*' # 打印每行内容:%-ns表示左对齐占n位,不足自动补空格 for txt in "${words[@]}"; do printf "* %-${numchar}s *\n" "$txt" done # 打印底部边框 printf '%*s\n' $((numchar + 4)) '' | tr ' ' '*'
两种方案运行后都可以得到你要的对齐效果。
内容的提问来源于stack exchange,提问作者BakedLizard
相关产品推荐
相关产品推荐

