2008年2月5日火曜日

プログレスバー(進捗表示)をLinuxのShellで表示するには?

2014 追記:ESC="\033" こっちの方が美しいな。カーソルの戻り位置を999にした方が楽だった。
2013/01 追記:なぜかcutコマンドでエラーが出るようになっていたので無視するよう修正。
2012/01 追記:再び自分の環境で必要になったので、そう言えば昔プログレスバー作ったなぁと思いググったら意外に需要があるようだ。ついでにソース表示を修正しとこう。


---
CISCOとか、ネットワーク機器のCONSOLEに繋いだ時に表示されるプログレスバー(進捗表示)を Shell で表示してみると便利かな? と思ったので作ってみた。

まずは、 #vi BAR    として/home/root99 に下記のshellを作成。
バーの表示はエスケープ・シーケンスを使うことにする。
ちなみに、 CLS="^[[2J"  と定義した場合 shell中での CLS 実行は、 Clear コマンドと同義である。

#!/bin/sh


#ESC='^['
#  ^[ は Ctrl+vの後 Esc を押すことで入力
ESC="\033"

#########################
# MAIN
#########################
if [ $# -eq 0 ]
then
 echo "Error: not arg"
 echo "$0 <LINE> <%> <Return Row> <Return Column>"
 #echo "example: $0 20 10 30 1"
 echo "example: $0 20 10 999 1"
 exit 1
fi
LINE=$1
PERC=$2
RETL=$3
RETC=$4

chrV="####################################################################################################"
chrS="____________________________________________________________________________________________________"
printf "${ESC}[${LINE};1H["
chrBAR=`echo "$chrV" | cut -c1-${PERC} 2>/dev/null`

if [ $PERC -ge 100 ];then
 CNT=0
else
((CNT = 100 - ${PERC}))
fi

chrSPC=`echo "$chrS" | cut -c1-${CNT} 2>/dev/null`

if [ $CNT -ne 100 ] ;then
printf "$chrBAR"
fi

if [ $CNT -ne 0 ] ;then
printf "$chrSPC"
fi

printf "] [ ${PERC}%%]"
printf "${ESC}[${RETL};${RETC}H"
#EOF



#chmod 755 ./BAR

で実行権限をつける。


./BAR プログラムの実行サンプル。

#!/bin/sh

CNT=0
while [ $CNT -le 100 ]
do
/home/root99/BAR 29 ${CNT} 999 1
#echo $CNT
((CNT = $CNT + 1))
done
#EOF








サンプルを実行するとこんな風にぴゅーーっと進捗バーが進行。

[root99@/home/root99/]#./BAR_sample.sh


[#################                                          ] [ 43%]



バックアップ取得などで、大体のサイズが予めわかっている場合は
CNT=`echo "scale=2;(${NOW} / ${MAX})* 100" | bc | sed "s/\\..*//"`
として、$CNT の値を %の引数とすれば良い。どうやら blogger は空白の処理が苦手っぽいので、shell 中でアンダーバー表示の
部分は空白に脳内変換してください。。。


個人的(どっかからぱくってきた)なmemo:
ESC[2J
    画面を全消去し、カーソルをホームポシションに戻す。このコマンドを
    実行する前に文字属性で背景色の設定をしておくと、その色でクリアさ
    れる。

ESC[p1;p2H
    カーソルを p1 行、p2 桁に移動する。

ESC[p1;-m
    文字属性を設定します。パラメータは最大 16 個までセミコロンで区切っ
    て同時に指定できます。指定できる属性は表 2 を参照して下さい。
ESC[p1@
    カーソル位置から右方向に p1 個、空白で埋める。

ESC[p1;p2@
    カーソル位置から右方向に p1 個、p2 で指定した文字で埋める。p2 はアス
    キーコードを 10 進数で指定する。

ESC[p1;p2;p3@
    カーソル位置から p3 で指定された方向に p1 個、p2 で指定した文字で埋め
    る。p2 はアスキーコードを 10 進数で指定する。p3 の指定方法は以下の通
    りである。
    p3 = 0; 右方向。カーソルは最後の文字の次に移動する。
    p3 = 1; 下方向。カーソルは最後の文字の次に移動する。
    p3 = 2; 右方向。カーソルは移動しない。
    p3 = 3; 下方向。カーソルは移動しない。

ESCESC
    16 進数 1BH を出力する。


表 2: 設定可能な文字属性
設定値    属性
0    全ての属性をデフォルト値にリセットする。
1    強調文字
5    ブリンク
7    反転
30    文字色を黒に設定
31    文字色を赤に設定
32    文字色を緑に設定
33    文字色を茶に設定
34    文字色を青に設定
35    文字色をマゼンダに設定
36    文字色をシアンに設定
37    文字色を白に設定
40    背景色を黒に設定
41    背景色を赤に設定
42    背景色を緑に設定
43    背景色を茶に設定
44    背景色を青に設定
45    背景色をマゼンダに設定
46    背景色をシアンに設定
47    背景色を白に設定



詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ (著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
詳解 シェルスクリプト

0 件のコメント:

.