Bash使用printf实现动态终端宽度下带颜色居中带两侧填充的标题
问题根因与解决方案
1. 为什么变量传入大括号计数无法正常求值?
Bash的大括号扩展{x..y}执行优先级早于变量扩展,当解析{1..$padlimit}时,$padlimit还没有被替换为实际数值,大括号扩展会判定为不合法的数字范围,不会做展开,最终你写的printf '%0.1s' -{1..$padlimit}只会输出1个-,这就是你第一次尝试时两边只有一个短横线的原因。
2. printf的算术表达式如何调整?
你原有的计算逻辑基本正确,只需要修正两个小问题:
- 移除冗余的宽度扣除逻辑,同时适配总宽度减标题长度为奇数的场景,保证左右填充对齐
- 更换更稳定的padding生成方式,绕开大括号扩展的优先级问题
修复后可直接运行的代码
MAGENTA=$(tput setaf 5) NOCOL=$(tput sgr0) heading="${1^^}" width="$(tput cols)" padlimit=30 if [[ $width -gt 240 ]]; then padlimit="$(( $width/8 ))" fi # 用tr生成指定长度的短横线填充,兼容变量传入长度 padding=$(printf '%*s' "$padlimit" "" | tr ' ' '-') # 计算左右填充长度,自动适配奇数宽度场景 total_pad_length=$(( width - ${#heading} - 2 )) left_pad=$(( total_pad_length / 2 )) right_pad=$(( total_pad_length - left_pad )) printf '%s%*.*s %s %*.*s%s\n' "$MAGENTA" \ 0 "$left_pad" "$padding" \ "$heading" \ 0 "$right_pad" "$padding" \ "$NOCOL"
内容的提问来源于stack exchange,提问作者pntha
相关产品推荐
相关产品推荐

