如何在bash中证明和居中文本?


6

新手在这里。我正在寻找bash脚本来居中并证明文本的合理性。我的脚本只适用于一行文本。你会如何改进它?

#!/bin/bash
COLS=$(tput cols)
while true; do
    clear
    echo -n "Type text "
    read text
    echo
    echo "Menu"
    echo "1) Right justify  "
    echo "2) Center "
    echo "3) Exit "
    echo
    echo -n "Choose [1-3]: "
    read opt
    echo
    case $opt in
        1) printf "%*s\n" $COLS "$text"
           break
        ;;
        2) printf "%*s\n" $[$COLS/2] "$text"
           break
        ;;      
        3) break
        ;;
        *)
        echo "Error. Press [1-3]"
        break
        ;;
    esac
done

Answers:


6

正如您所发现的,$COLUMNS仅在交互式-ishell中有用,因此我们使用它columns="$(tput cols)"

我唯一的问题是下面这一行。它不是文本的中心。
printf "%*s\n" $[$COLS/2] "$text"

扩展您的工作,这是一个显示居中文本(来自文件)的功能。要在脚本中调用它,请使用display_center "file.txt"

display_center(){
    columns="$(tput cols)"
    while IFS= read -r line; do
        printf "%*s\n" $(( (${#line} + columns) / 2)) "$line"
    done < "$1"
}

注意使用${#line}(类似于wc -m)来计算行中的字符数。只要您只需要显示没有颜色/格式的纯文本,那么这应该可以正常工作。

这是一个使用相同的printf实现显示右对齐文本(从文件中)的函数。

display_right(){
    columns="$(tput cols)"
    while IFS= read -r line; do
        printf "%*s\n" $columns "$line"
    done < "$1"
}

您也可以使用tput和echo执行类似的操作,但下面的示例并不那么健壮(即使用长字符串会失败)。

row=0
col=$(( ($(tput cols) - ${#text}) / 2))
tput clear
tput cup $row $col
echo "$text"

此外,您可能需要考虑使用dialogselect生成菜单。它会使你的脚本更清晰。
http://bash.cyberciti.biz/guide/Select_loop
https://serverfault.com/questions/144939/multi-select-menu-in-bash-script


3
#!/usr/bin/awk -f
{
  z = 92 - length
  y = int(z / 2)
  x = z - y
  printf "%*s%s%*s\n", x, "", $0, y, ""
}

输入

你好,世界
阿尔法布拉沃查理三角洲

产量

                                         你好,世界
                                  阿尔法布拉沃查理三角洲

3
awk '{ z = '$(tput cols)' - length; y = int(z / 2); x = z - y; printf "%*s%s%*s\n", x, "", $0, y, ""; }'
galva 2016年

1

没有破坏行内容?

此解决方案将文本放在光标当前所在行的中心,而不会在其边框周围打印空格。如果你想在不破坏线上当前打印的内容的情况下居中文本,它非常有用。

注意:您的shell必须支持ANSI转义序列才能使其示例正常工作。

#!/bin/bash
print_center(){
    local x
    local y
    text="$*"
    x=$(( ($(tput cols) - ${#text}) / 2))
    echo -ne "\E[6n";read -sdR y; y=$(echo -ne "${y#*[}" | cut -d';' -f1)
    echo -ne "\033[${y};${x}f$*"
}

# main()

# clear the screen, put the cursor at line 10, and set the text color
# to light blue.
echo -ne "\\033[2J\033[10;1f\e[94m"

# do it!
print_center 'A big blue title!'

光标将留在“标题”的末尾。在这个例子中。使用其他ANSI序列根据需要重新定位光标。


优点

  • 适用于SSH
  • 可以调整设备缓冲区大小而不会出现中心问题(动态)
  • 不破坏行内容
  • ASCII游戏/动画友好。

缺点

  • 如果您的终端不支持ANSI转义序列,则无效
  • 不适用于滚动日志输出。
  • 取决于bash

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.