linux - 无论 bash printf 输出如何,都将文本保留在适当的位置

标签 linux bash shell printf

当数字变大时就会发生这种情况......刚刚开始处理这个困惑。 文本被更大的输出推来推去……我该如何控制这种困惑?

       Accounts......: 5      Mail..........: 7
       Banned........: 0      Pets..........: 1
       Online........: 0      Tickets.......: 0
       Guilds........: 1      Corpses.......: 0      PvP.......: 0
       Members.......: 1      Characters....: 10      Gifts.....: 4   <-----HOWTO Reserve/Preserve spaces ?? ??

应该看起来像这样:

       Accounts......: 5      Mail..........: 7
       Banned........: 0      Pets..........: 1
       Online........: 0      Tickets.......: 0
       Guilds........: 1      Corpses.......: 0      PvP.......: 0
       Members.......: 1      Characters....: 10     Gifts.....: 4

现在这个困惑看起来像这样:


ch_count=$(mysql --defaults-extra-file="$sql_mycnf" -N --execute="SELECT count(*) FROM $db_characters.characters;"); &> /dev/null


cm_char="\033[0mCharacters\e[0;32m....:\033[0m $ch_count\e[31m"

line="      "

           $cm_acco$line$cm_mail
           $cm_bann$line$cm_pets
           $cm_onli$line$cm_tick
           $cm_guil$line$cm_corp$line$cm_pvps
           $cm_memb$line$cm_char$line$cm_gifts

在另一台服务器上有相同的输出,但因为它们较小,所以看起来不错:

           Accounts......: 4      Mail..........: 0
           Banned........: 0      Pets..........: 0
           Online........: 0      Tickets.......: 0
           Guilds........: 0      Corpses.......: 0      PvP.......: 0
           Members.......: 0      Characters....: 2      Gifts.....: 0

编辑此行以使其正常工作? 这是正确的起点吗?

cm_char="\033[0mCharacters\e[0;32m....:\033[0m $ch_count\e[31m"

杀了我。

最佳答案

创建 2 个函数来格式化字段并使用它们:

dot_field() {
   # todo Change implementation when field can be 2 words with a space in between
   printf "%-14.14s:" "$1" | tr ' ' '.'
}

space_number() {
   printf "%-7.7s" "$1"
}

printline() {
   # Todo: add logic when only 4 parameters are given
   echo "       $(dot_field $1) $(space_number $2)$(dot_field $3) $(space_number $4)$(dot_field $5) $(space_number $6)"
}

printline "Guilds" 1 "Corpses" 0 "PvP" 0
printline "Members" 1 "Characters" 10 "Gifts" 4
printline "LongFieldName" 1 "High" 999999 "X" 2

编辑:添加颜色。

您不希望您的代码充满颜色的转义码。这取决于您希望如何构建颜色代码的完整上下文,我为问题的有限上下文给出了一个示例。它应该让您了解如何为自己制作这样的东西。

init_colors() {
    reset=$(tput sgr0)
    bold=$(tput bold)
    black=$(tput setaf 0)
    red=$(tput setaf 1)
    green=$(tput setaf 2)
    yellow=$(tput setaf 3)
    blue=$(tput setaf 4)
    magenta=$(tput setaf 5)
    cyan=$(tput setaf 6)
    white=$(tput setaf 7)
    user_color=$bold
}

# colorstring reads from stdin and uses parameter 1 as an escape sequence
# with more parameters the first is used as a color, the other as the string to be modified
# It will set colors until the last space sequence
colorstring() {
   case $# in
   0) # invalid
      echo "colorstring called without parameters"
   ;;
   1)
      sed -r "s/^.*[^ ]/$1&${reset}/"
      ;;
   *)
      color="$1"
      shift
      sed -r "s/^.*[^ ]/${color}&${reset}/" <<< "$@"
   ;;
   esac

}

dot_field() {
   # todo Change implementation when field can be 2 words with a space in between
   printf "%-14.14s" "$1" | colorstring ${cyan} | tr ' ' '.'
   # The : must be printed in a second statement when you don't want cyan dots.
   printf ':'
}

space_number() {
   printf "%-7.7s" "$1" | colorstring ${red}
}

printline() {
   echo "       $(dot_field $1) $(space_number $2)$(dot_field $3) $(space_number $4)$(dot_field $5) $(space_number $6)"
}

# init the color variables
init_colors
# Next echo not needed, just testing the new colorstring function
echo "$(colorstring ${blue} blue string) $(colorstring ${red} red car) $(colorstring ${white} white snow) $(colorstring ${yellow} yellow marker) $(colorstring ${cyan} cyan) "
printline "Guilds" 1 "Corpses" 0 "PvP" 0
printline "Members" 1 "Characters" 10 "Gifts" 4
printline "LongFieldName" 1 "High" 999999 "X" 2

关于linux - 无论 bash printf 输出如何,都将文本保留在适当的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59862020/

相关文章:

linux - 更改 Beagle Bone Black USB0 的静态 IP

linux - 系统(命令)在生产服务器上返回 false : Ruby on Rails

bash - 为什么 $@ 与 bash 中的大多数其他变量不同?

c - 构建 makefile 依赖/继承树

linux - 使用ffplay在特定窗口位置打开视频

linux - 在 sed 中加入行范围的正则表达式

反引号内的 Bash 完成或 $() 使用 complete

mysql -\!某些命令在远程 mysql 连接中无法正常工作

ruby - 如何从 Ruby 调用 shell 命令

bash 检查目录中所有文件的扩展名