Bash

bash Dialog(Whiptail)進度條的問題

  • September 17, 2021

我正在嘗試為命令列表創建一個 bash 對話框(whiptail)進度條。因此,當命令在後台一一執行時,該進度條會與消息一起顯示。我正在使用whiptail,這是一個Ubuntu伺服器,所以,我不是在看需要Xserver的基於GTK的實用程序,例如Zenity、Yad等。我對bash腳本非常陌生,我不知道我哪裡出錯了幫助表示讚賞。

系統作業系統:Ubuntu 20.04

問題:

消息一次全部顯示,而不是階段/每個命令,並且所有命令開始並行執行(一次全部)而不是一個一個地執行。程式碼錯了嗎?我應該使用 for 循環而不是 while 循環,如果那麼如何?

我的命令列表:

{
       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 安裝成功完成” )

我認為您正在尋求朝這個方向做一些事情:

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

這裡的要點是兩個數組,一個用於消息,一個用於命令。通常,您希望對單個命令行使用完整數組(請參閱我們如何執行儲存在變數中的命令?),但我們沒有二維數組,因此將它們儲存為字元串eval可以用作代替。

(我沒有解決這個問題以獲得正確的百分比,已經晚了。)

引用自:https://unix.stackexchange.com/questions/669347