我正在尝试为命令列表创建一个 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
作为替代。
(我没有解决这个问题以获得正确的百分比,已经晚了。)