Linux + bashで単純な進行状況バーを作成する方法

Linux + bashで単純な進行状況バーを作成する方法

Bashスクリプトに「.」を表示する進行状況バーを追加したいと思います。文字が進み、MAX 180秒後にプロセスが終了します。

Bashスクリプトはカールコマンドを使用するため、カールは一定時間後に結果を提供しますが、180秒を超えません。

似たようなもの

|.                                           after 2 sec
|...........                                 after 60 sec
|...................                         after 100 sec
|..........................                  after 150 sec
|................................|           after 180 sec 

最終例

|................................|       after 180 sec 

または

|....|                                   after 30 sec 

答え1

通常のBashでこれを行うのはとても簡単です。

#!/bin/bash
# progress bar function
prog() {
    local w=80 p=$1;  shift
    # create a string of spaces, then change them to dots
    printf -v dots "%*s" "$(( $p*$w/100 ))" ""; dots=${dots// /.};
    # print those dots on a fixed-width space plus the percentage etc. 
    printf "\r\e[K|%-*s| %3d %% %s" "$w" "$dots" "$p" "$*"; 
}
# test loop
for x in {1..100} ; do
    prog "$x" still working...
    sleep .1   # do some work here
done ; echo

最初のパラメータprogはパーセンテージで、他のパラメータは進行状況バーの後に印刷されます。w関数の変数はバーの幅を制御します。完了したら改行文字を印刷します。この関数は改行文字を印刷しません。


もう1つの可能性は、このツールを使用することですpv。その目的はパイプラインのスループットを測定することですが、そのために1つを作成することができます。

for x in {1..100} ; do
    sleep .1    # do some work here
    printf .
done | pv -pt -i0.2 -s100 -w 80 > /dev/null

ここでは、-pt進行状況バーとタイマーが有効になり、合計出力-s 100サイズが設定され、関数内で印刷されるすべての項目がそのサイズに対して計算されます。

答え2

通常、行を上書きしてこれを行うことができます。端末\rに書き込まずに行の先頭に戻るために使用されます。\n

完了したら、\n進行方向を書き留めます。

使用echo -ne:

  • \n印刷されず
  • 次のエスケープシーケンスを識別します。\r.

以下はデモです:

echo -ne '...                     (33%)\r'
sleep 1
echo -ne '......                  (66%)\r'
sleep 1
echo -ne '..........              (100%)\r'
echo -ne '\n'

編集:cURLに進行状況バーが表示されるようになりました。--progress-bar欲しいものではありませんか?

回答から取得https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script

Googleを使って最初の答えを見つけました。クエリは「bashプログレスバー」です。

関連情報