コマンドリストのbashダイアログボックス(whiptail)進行状況バーを作成しようとしています。したがって、バックグラウンドでコマンドが1つずつ実行されると、メッセージとともに進行状況バーが表示されます。 Ubuntuサーバーであるhiptailを使用しているため、Zenity、YadなどのXserverを必要とするGTKベースのユーティリティは考慮しません。私はbashスクリプトに初めて触れましたが、どこで間違っているのかわかりません。助けてくれてありがとう。
システムオペレーティングシステム:Ubuntu 20.04
質問:
メッセージは各コマンドのステップではなく一度にすべて表示され、すべてのコマンドは順番に実行されるのではなく、並列に(一度に)実行され始めます。コードに問題がありますか? whileループの代わりにforループを使用する必要がありますか?それではどうなりますか?
私のコマンドリスト:
{
sudo apt-get update -y
sudo apt-get install nginx -y
sudo systemctl reload nginx
sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get -y install php-fpm
sudo apt-get install mariadb-server -y
}
進行状況バーのコードは次のとおりです。
#!/usr/bin/env bash
(
msgs=( "Preparing install..." "Starting Nginx installation..." "Nginx installation completed successfully" "Starting Mariadb installation..." "Starting PHP installation..." "PHP installation completed successfully" )
items=$(
{
#echo "Preparing install..."
sudo apt-get update -y
#echo "Starting Nginx installation..."
sudo apt-get install nginx -y
#echo "Nginx installation completed successfully"
sudo systemctl reload nginx
#echo "Starting Mariadb installation..."
sudo apt-get install mariadb-server -y
#echo "Starting PHP installation..."
sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get -y install php-fpm
#echo "PHP installation completed successfully"
sudo systemctl reload nginx
} | wc -l)
processed=0
while [ $processed -le $items ]; do
pct=$(( $processed * 100 / $items ))
echo "XXX"
echo $processed
echo ${msgs["$processed"]}
echo XXX
echo "$pct"
processed=$((processed+1))
sleep 1
done
) | whiptail --title "Gauge" --gauge "Please wait..." 10 60 0
メッセージは次のとおりです。
msgs=( "インストール準備中..." "Nginx インストール開始中..." "Nginx インストールが正常に完了しました。" "Mariadb インストール開始中..." "PHP インストール開始中..." "PHPインストールが正常に完了しました」)
答え1
私はあなたがこの方向に何かをしていると思います。
msgs=("Preparing install..."
"Starting Nginx installation..."
...
)
commands=("sudo apt-get update -y"
"sudo apt-get install nginx -y"
...
)
n=${#commands[@]}
i=0
while [ "$i" -lt "$n" ]; do
pct=$(( i * 100 / n ))
echo XXX
echo $i
echo "${msgs[i]}"
echo XXX
echo "$pct"
eval "${commands[i]}"
i=$((i + 1))
done | whiptail --title "Gauge" --gauge "Please wait..." 10 60 0
ここで重要なのは、メッセージ用の配列とコマンド用の配列の2つです。通常、単一のコマンドラインで配列全体を使用しようとしています(参照:変数に保存されたコマンドをどのように実行できますか?)、しかし2D配列がないので、それを文字列として保存することはeval
代わりに機能するかもしれません。
(正確な割合を得るためにこの問題を修正していません。遅すぎます。)