2017-04-18 204 views
1

我對BASH很陌生,我想知道如何在同一行中打印兩個字符串。BASH在相同的兩行上打印兩個字符串

我想要做的是在BASH中創建一個2行的進度條。 創建1號線的進度條是相當容易的,我不喜歡這樣寫道:

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

但現在我試圖做同樣的事情,但與2號線,以及一切我試過到目前爲止還沒有。

在第二行中,我想放置一個「進度詳細信息」,告訴我它在腳本中的哪個位置,例如:正在收集哪個變量,正在運行哪個功能。但我似乎無法創建一個2行的進度條。

+0

對不起朋友,但我不認爲你可以做到這一點。但爲什麼不考慮把進度放在同一行 – sjsam

+0

[如何將進度條添加到shell腳本?](http://stackoverflow.com/questions/238073/how-to-add-a-progress -bar-shell-script) –

+0

@djm不,只包含單行進度條。這是專門詢問多條線路。 – tripleee

回答

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' 
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" 

循環調用th e status功能在特定時間顯示適當的文本。

輸出結果將類似於:

Status Completing 70% 
============== 
相關問題