명령 목록에 대한 bash 대화 상자(whiptail) 진행 표시줄을 만들려고 합니다. 따라서 백그라운드에서 명령이 하나씩 실행되면 메시지와 함께 진행률 표시줄이 표시됩니다. Ubuntu 서버인hiptail을 사용하고 있으므로 Zenity, Yad 등과 같이 Xserver가 필요한 GTK 기반 유틸리티는 고려하지 않습니다. 저는 bash 스크립팅을 처음 접했는데 어디서 잘못되었는지 모르겠습니다. 도움을 주셔서 감사합니다.
시스템 운영 체제: 우분투 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
여기서 중요한 점은 메시지용 배열과 명령용 배열 두 개입니다. 일반적으로 단일 명령줄에 전체 배열을 사용하려고 합니다(참조:변수에 저장된 명령을 어떻게 실행할 수 있나요?), 하지만 2D 배열이 없으므로 이를 문자열로 저장하는 것이 eval
대안으로 작동할 수 있습니다.
(정확한 비율을 얻기 위해 이 문제를 수정하지 않았습니다. 너무 늦었습니다.)