bash 对话框 (Whiptail) 进度条的问题

bash 对话框 (Whiptail) 进度条的问题

我正在尝试为命令列表创建一个 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 安装成功完成" )

答案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

这里的要点是两个数组,一个用于消息,一个用于命令。通常,您希望对单个命令行使用完整数组(请参阅我们如何运行存储在变量中的命令?),但我们没有二维数组,因此将它们存储为字符串可以eval作为替代。

(我没有解决这个问题以获得正确的百分比,已经晚了。)

相关内容