答え1
を使用してこれを行う方法はありませんbar
。ただし、同じことを行い、ニーズに合った他のコマンドに興味があるかもしれません。
方法 #1 - 偽装
この方法は、以前に画面にあった内容をより大きな進行状況バーで上書きします。シンプルだが効果的。
はいex.bash
:
#!/bin/bash
echo -ne '##### (33%)\r'
sleep 1
echo -ne '############# (66%)\r'
sleep 1
echo -ne '####################### (100%)\r'
echo -ne '\n'
方法#2 - パイプラインビュー
このコマンドはpv
進行状況バー機能を提供します。この投稿でより詳細な例を見ることができます。知っておくべきUnixユーティリティ:パイプビューア。
$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59
方法#3 - スピナー
次のコード例を使用して、単純なループで独自の「スピナー」を構築できます。ループ内に必要なコマンドを含めることができます。このコードは、次の記事から取得したものです。Bashでスピナーを作ることはできますか?。
#!/bin/bash
sp='/-\|'
printf ' '
for i in $(seq 3); do
printf '\b%.1s' "$sp"
sp=${sp#?}${sp%???}
sleep 1
done
echo ''
方法 #4 - ダイアログ
dialog
必要なことを行うコマンドがあります。グラフィックダイアログを使用しますがncursesに基づいているため、ncursesがサポートされている限り、ほとんどの端末および/またはスクリプトで機能します。君はみんな見ることができるdialog
プロジェクトウェブサイトの文書。
スクリーンショット
引用する
答え2
実装するのは簡単ではないようです。以下のbash機能(bar)はbar
スクリプトと同様に機能します(ショートスクリーンキャストベース)。また、端末の幅に応じて動的にサイズ変更されます(次回の呼び出し時にbar
)。
#!/bin/bash
#Helper functions
terminal_width(){
local width_height=`stty size`
echo ${width_height/* /}
}
string_times_n(){
local s=$1
local n=$2
for((i=0;i<n; i++)); do echo -n "$s"; done
}
##The actual function
bar(){
local percentage=$1
local padding=10
local width=$(echo "scale=0; 0.5 * $(terminal_width)" | bc | cut -d. -f1)
local equals_n=$(echo "$percentage * $width / 100" | bc | cut -d. -f1)
local dots_n=$((width - equals_n))
#ANSI escape sequence magic
local Esc="\033["
local up="$Esc""K""$Esc""1A""$Esc""K"
#Clear the line
string_times_n ' ' "$width"
echo -ne "\r"
#Print the current screen
printf "%3s%% [" "$percentage"
string_times_n '=' "$equals_n"
string_times_n '.' "$dots_n"
echo -n "]"
#Go up unless finished
if [[ "$percentage" == 100 ]]
then
echo
else
echo -e "$up"
fi
}
使用法
. bar.sh #Assuming it's saved in bar.sh
bar $percentage
定期的な進行の例:
for i in {1..10}; do bar $((i*10)); sleep 0.1; done;
ランダム進行の例:
for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;