シェルで同じ行に進捗状態を更新して表示する方法について説明します。

同じ行の情報を更新するには、以下の手順を踏みます。
 1.echoで表示する時、"\c"を指定する。
  →改行を抑止する。
 2.改行しない状態でecho "\r\c"を行う。
  →行の先頭にフォーカスを移動する。

これを行えば、同じ行に新たな情報を記述することができます。

前回表示した文字列より短い文字列を表示する場合、ゴミデータが表示されてしまうことがあります。
あらかじめ、スペースで前回データを上書きする等して、表示がおかしくならないよう注意しましょう。

以下、サンプル。
■progress.sh

#!/bin/sh

#####################################################################
#同じ行に0%〜100%完了と上書き表示する(サンプル)
#####################################################################

#----- 変数の説明 -----
#prog --- 進捗度
#len --- 表示する文字列の長さ
#count --- 空白文字のカウンタ
#spc --- 空白文字列
#spclen --- 空白文字列の長さ

len=0
count=0
spc=" "
spclen=`expr length "${spc}"`

#繰り返しは、forとwhileはどちらを使っても良い(処理に応じて変更)
#whileの場合はcountの初期化が必須

#for count in 0 10 20 30 40 50 60 70 80 90 100
prog=0
while [ $prog -le 100 ]
do
#表示する文字数が前回表示した分よりも短い文字列だとゴミが残るので注意!
#ゴミを残したくない場合は、描画領域を空白でクリアする
if [ $len -ne 0 ] ; then
#設定する文字列を初期化するが、毎回やるのは効率が悪い
#空白文字列の長さ < 表示した文字列の長さの場合のみ更新する
if [ $spclen -lt $len ] ; then
count=$spclen
while [ $count -le $len ]
do
spc=${spc}" "
count=`expr $count + 1`
done
echo "${spc}\c"
spclen=`expr length "${spc}"`
echo "\r\c"
fi
fi

#末尾の\cは改行しないことを明示する
echo "${prog}%完了\c"
#表示した文字列の長さを取得
len=`expr length "${prog}%完了\c"`
#直前のechoで改行せずに"\r\c"を出力すると同じ行の先頭にフォーカスする
echo "\r\c"

#progの更新
prog=`expr $prog + 10`

#サンプルでは同じ位置に上書き表示していることが分かるよう1秒スリープ
sleep 1
done
#コマンド終了時にカレント表示で上書きされてしまうので、ここで改行を入れる
echo ""

exit 0


上記のシェルをターミナルから実行すると、同じ行の同じ位置の表示を更新します。