You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Shell中实现内容的居中显示与下划线格式输出?

在Shell中实现居中对齐且带下划线的文本输出

嘿,这个问题我熟!在Shell环境里完全可以实现居中显示加下划线的文本输出,核心就是用ANSI转义序列处理格式,再通过计算终端宽度来实现居中。我给你一步步拆解:

1. 先搞定下划线格式

Shell里可以用ANSI转义序列来控制文本格式,开启下划线的序列是\e[4m,关闭下划线是\e[24m(一定要记得关闭,不然后续所有输出都会带下划线)。

echo的话要加-e参数让它解析转义字符:

echo -e "\e[4m这是一段带下划线的文本\e[24m"

或者用printf(更推荐,兼容性更好):

printf "\e[4m这是一段带下划线的文本\e[24m\n"

2. 实现文本居中

要让文本居中,得先知道当前终端的宽度,然后计算需要在文本左边填充多少空格。

  • tput cols可以实时获取终端的列数(比直接用环境变量$COLUMNS更靠谱,因为终端大小变化时它会自动更新)
  • 计算文本长度,再算出需要填充的空格数

示例代码:

# 定义要居中的文本
TEXT="我要居中显示"
# 获取终端宽度
COLUMNS=$(tput cols)
# 计算文本长度
TEXT_LENGTH=${#TEXT}
# 计算左边需要填充的空格数(如果终端比文本窄,就设为0)
PAD=$(( (COLUMNS - TEXT_LENGTH) / 2 ))
if [ $PAD -lt 0 ]; then
    PAD=0
fi

# 输出居中文本
printf "%*s%s\n" $PAD "" "$TEXT"

这里%*s是printf的格式化语法,*会用后面的PAD值来指定填充的空格数,相当于先输出PAD个空格,再输出文本。

3. 两者结合:居中+下划线

把下划线的转义序列加到文本的前后,再结合居中的逻辑就行:

TEXT="Hello, Centered Underline!"
COLUMNS=$(tput cols)
TEXT_LENGTH=${#TEXT}
PAD=$(( (COLUMNS - TEXT_LENGTH) / 2 ))
if [ $PAD -lt 0 ]; then
    PAD=0
fi

# 先输出空格,再输出带下划线的文本
printf "%*s\e[4m%s\e[24m\n" $PAD "" "$TEXT"

4. 封装成复用函数

如果经常用,把逻辑封装成函数更方便:

center_underline() {
    # 接收第一个参数作为要输出的文本
    local TEXT="$1"
    local COLUMNS=$(tput cols)
    local TEXT_LENGTH=${#TEXT}
    local PAD=$(( (COLUMNS - TEXT_LENGTH) / 2 ))

    if [ $PAD -lt 0 ]; then
        PAD=0
    fi

    printf "%*s\e[4m%s\e[24m\n" $PAD "" "$TEXT"
}

# 使用示例
center_underline "欢迎使用居中下划线文本"
center_underline "Short Text"
center_underline "这是一段超级长的测试文本,用来验证终端宽度不够时的处理逻辑"

注意:大部分现代终端(比如iTerm2、Gnome Terminal、Xterm)都支持ANSI转义序列,如果你用的是非常老旧的终端,可能会直接显示转义字符而不是格式效果。

内容的提问来源于stack exchange,提问作者Joe Walsh

火山引擎 最新活动