必要
シェルを使用してソフトウェア インストール スクリプトを作成し、プログレス バーを表示する
例
#!/bin/bash
# 模拟软件安装的步骤列表
steps=("解压文件" "安装依赖" "配置设置" "复制文件" "")
# 计算总步骤数
total_steps=${
#steps[@]}
# 安装进度的初始值
progress=0
# 打印安装进度函数
print_progress() {
local current_step=$1
local percentage=$2
local step=$3
# 清除当前行
printf "\r\033[K"
# 构建进度条字符串
local progress_bar=$(printf "[%-${total_steps}s] %d%%" "$(yes "#" | head -n $current_step | tr -d '\n')" "$percentage")
# 打印安装进度
printf "安装进度: %s %s" "$progress_bar" "$step"
}
# 循环执行每个步骤
for ((i=0; i<total_steps; i++)); do
step=${steps[$i]}
# 模拟每个步骤的安装操作
sleep 1
# 更新进度
((progress = (i+1) * 100 / total_steps))
# 打印安装进度
print_progress "$((i+1))" "$progress" "$step"
done
# 打印安装完成消息
printf "\n软件安装完成!\n"
この例では、ANSI エスケープ シーケンスを使用して、元の出力情報を上書きし、進行状況バーを同じ行に表示し続けます。上書き効果は、キャリッジ リターンに \r を使用し、続いて \033[K を使用して現在の行の内容をクリアすることで実現できます。
print_progress 関数では、まず現在の行の内容をクリアし、次にプログレス バー文字列を作成し、\r を使用して行の先頭への復帰の効果を実現します。プログレスバーの文字列には、現在のステップの塗りつぶしとパーセンテージが含まれます。
最後に、print_progress 関数を呼び出してインストールの進行状況が出力され、インストールが完了するとインストール完了メッセージが出力されます。
詳細
local progress_bar=$(printf "[%-${total_steps}s] %d%%" "$(yes "#" | head -n $current_step | tr -d '\n')" "$percentage")
この線をどう理解すればいいでしょうか?
このコード行は、進行状況バー文字列を構築するために使用されますprogress_bar
。
このコード行が何を意味するのかを順を追って説明します。
-
yes "#" | head -n $current_step
: コードのこの部分では、yes
コマンドを使用して無限に繰り返される#
文字列を生成し、head -n $current_step
コマンドを使用して前の$current_step
行をインターセプトします。これ#
により、長さ の文字列が生成されます$current_step
。 -
tr -d '\n'
: コードのこの部分では、tr
コマンドを使用して string 内の改行文字を削除します\n
。つまり、複数行の文字列を 1 行に結合します。 -
$percentage
: コードのこの部分は、進捗率の数値です。 -
$(printf "[%-${total_steps}s] %d%%" ...)
: コードのこの部分では、printf
書式設定された文字列の関数を使用して、$current_step
文字#
列と行の進行状況のパーセンテージを書式設定された文字列に挿入します。
具体的な説明は以下の通りです。
-
[%-${total_steps}s]
$total_steps
: これは、角括弧の固定長文字列を表す書式設定された文字列です。ここで-%
、 は左揃えを表し、${total_steps}s
パディング文字の文字列プレースホルダーを表します#
。 -
%d%%
: これは、進行状況のパーセンテージの値を埋めるために使用される整数のプレースホルダーを表す書式設定された文字列であり、次の場合は%%
パーセント記号文字を出力することを意味します%
。
最終的に、progress_bar
文字列の内容は のようなものになり[##### ] 50%
、#
インストールの進行に応じて数値と進行状況のパーセンテージが変化します。