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サイズが設定され、関数内で印刷されるすべての項目がそのサイズに対して計算されます。

おすすめ記事