Incremento e tudo parece estar absolutamente bem. Mas todos os incrementos estão ocorrendo dentro de um subshell que está sendo passado para zenity
. Esta é a razão pela qual você não está obtendo as alterações quando você echo
delas estão fora da subshell. Estou usando seu script, adicionando apenas algo para imprimir as variáveis dentro da janela do while
loop no zenity
. Para saber mais sobre a sintaxe do diálogo de progresso do zenity, consulte a página de ajuda do gnome . Execute o script abaixo e veja o resultado,
#!/bin/bash
i=0
p=0
(while [ $i -lt 100 ]
do
i=$[$i + 10]
echo $i ; sleep 1
echo "# now i is $i and p=$p"
p=$[$p + 1]
done) | zenity --progress --title="test" --text="test"
echo "i: $i p: $p"
Eu alterei o incremento de i
para 10, pois i
será usado para aumentar a barra de progresso e usou sleep 1
para tornar o progresso perceptível.
Observação:
Embora o valor esteja mostrando a ser incrementado em zenity
pop-up. Está mostrando para ser inalterado no terminal, i: 0 p: 0
Espero que isso seja útil.
Como usar variáveis subshell fora
O shell pai não pode usar variáveis de sua sub-shell. Você pode encontrar mais sobre subshell aqui . Mas você sempre pode escrever variáveis do subshell em um arquivo temporário para seu pai ler. Pode não ser o melhor dos caminhos, mas funciona.
#!/bin/bash
..
(while [ $i -lt 100 ]
do
...
...
done
echo "p=$(echo $p)" > tmp
echo "i=$(echo $i)" >> tmp
) | zenity --progress --title="test" --text="test"
. tmp
rm tmp
echo "i: $i p: $p"
Agora ele vai aparecer no terminal como i: 100 p: 10
para você usá-los ao seu gosto. E como você perguntou na última parte, não é o loop while, mas sim o subshell. É costume colocar o conteúdo da subshell dentro de parênteses.