web-dev-qa-db-ja.com

Linux + bashでシンプルなプログレスバーを作成する方法

"。"を表示する進行状況バーをbashスクリプトに追加したいと思います。進行状況としての文字、およびプロセスはMAX 180秒後に終了しました

bashスクリプトではcurlコマンドを使用するので、curlはしばらくすると結果を出しますが、180秒を超えない

そんな感じ

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

最後の例

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

または

|....|                                   after 30 sec 
2
yael

これは単純な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ツールを使用することです。パイプラインのスループットを測定するためのものですが、それを作成することもできます。

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は合計出力サイズを設定し、関数内で出力するものはすべてそのサイズに対してカウントされます。

7
ilkkachu

通常、これは行を上書きすることで実装できます。 \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プログレスバー」

1
thecarpy