Bashダイアログボックスの進行状況バーの問題(Whiptail)

Bashダイアログボックスの進行状況バーの問題(Whiptail)

コマンドリストの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代わりに機能するかもしれません。

(正確な割合を得るためにこの問題を修正していません。遅すぎます。)

関連情報