BASH在相同的2行上打印2个字符串

时间:2017-04-18 16:47:10

标签: linux bash

我对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 个答案:

答案 0 :(得分: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%
==============

答案 1 :(得分:0)

您可以使用\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'