Bash
bash Dialog(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 安裝成功完成” )
我認為您正在尋求朝這個方向做一些事情:
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
可以用作代替。(我沒有解決這個問題以獲得正確的百分比,已經晚了。)