【问题标题】:BASH printing 2 strings on the same 2 linesBASH 在相同的 2 行上打印 2 个字符串
【发布时间】:2017-04-18 16:47:09
【问题描述】:

我对 BASH 比较陌生,我想知道如何在相同的 2 行上打印 2 个字符串。

我想要做的是在 BASH 中创建一个 2 行进度条。 创建 1 行进度条相当简单,我是这样操作的:

echo -en 'Progress: ###          - 33%\r'
echo -en 'Progress: #######      - 66%\r'
echo -en 'Progress: ############ - 100%\r'
echo -en '\n'

但现在我正在尝试做同样的事情,但只有 2 行,到目前为止我尝试的一切都失败了。

在第二行中,我想添加一个“进度详细信息”,告诉我它在脚本中的哪个位置,例如:正在收集什么变量,它正在运行什么函数。但我似乎无法创建 2 行进度条。

【问题讨论】:

  • 对不起,伙计,但我认为你做不到。但是为什么不考虑把进展放在同一条线上
  • @djm 不,这仅涵盖单行进度条。这是专门询问多行。

标签: linux bash


【解决方案1】:

可以使用tputprintf 覆盖双行,例如:

function status() { 
    [[ $i -lt 10 ]] && printf "\rStatus Syncing %0.0f" "$(( i * 5 ))" ; 
    [[ $i -gt 10 ]] && printf "\rStatus Completing %0.0f" "$(( i * 5 ))" ;
    printf "%% \n" ;
}

for i in {1..20}
do status
    printf "%0.s=" $(seq $i) ; 
    sleep .25 ; tput cuu1 ; 
    tput el ; 
done ; printf "0%%\n" ; printf " %.0s" {1..20} ; printf "\rdone.\n"

单行:

for i in {1..20}; do status ; printf "%0.s=" $(seq $i) ; sleep .25 ; tput cuu1 ; tput el ; done ; printf "0%%\n" ; printf " %.0s" {1..20} ; printf "\rdone.\n"

循环调用status 函数以在特定时间显示适当的文本。

生成的输出类似于:

Status Completing 70%
==============

【讨论】:

    【解决方案2】:

    您可以使用\033[F 转到上一行,并使用\033[2K 擦除当前行(以防您的输出长度发生变化)。

    这是我做的脚本:

    echo -en 'Progress: ###          - 33%\r'
    echo -en "\ntest"   # writes progress detail
    echo -en "\033[F\r" # go to previous line and set cursor to beginning
    
    echo -en 'Progress: #######      - 66%\r'
    echo -en "\n\033[2K" # new line (go to second line) and erase current line (aka the second one)
    echo -en "test2"     # writes progress detail
    echo -en "\033[F\r"  # go to previous line and set cursor to beginning
    
    echo -en 'Progress: ############ - 100%\r'
    echo -en "\n\033[2K" # new line and erase the line (because previous content was "test2", and echoing "test" doesn't erase the "2")
    echo -en "test"      # write progress detail
    echo -en '\n'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多