Use read
com um tempo limite -t
e defina uma variável com base em sua saída.
#!/bin/bash
running=true
for ((i=1; i <= 100; i++ )); do
if [[ "$running" == "true" ]]; then
printf "\r%s - %s" "$i" $(( 100 - i ))
fi
if read -sn 1 -t 0.25; then
if [[ "$running" == "true" ]]; then
running=false
else
running=true
fi
fi
done
Com isso, você pode pressionar qualquer tecla para pausar ou cancelar a pauta do script.
running
armazena true ou false para informar se queremos que o loop funcione ou agora. read -sn 1 -t 0.25
é a chave, lê um caractere -n1
, suprime pressionamentos de tecla -s
e aguarda apenas 0,25s -t 0.25
. Se read
expirar, ele retornará um status de saída nenhum 0, que detectamos com o if
e somente se uma tecla foi pressionada, alternamos o status de execução.
Você também pode atribuir o caractere de leitura a uma variável e verificar um caractere específico para limitá-lo a apenas uma chave.
if read -sn 1 -t 0.25 key && [[ "$key" = "s" ]] ; then
Use "$key" == ""
se você quiser verificar o espaço ou entrar.
Observe que um dos efeitos colaterais do tempo limite de leitura + é que, se você pressionar uma tecla, o próximo loop será executado mais rapidamente que o normal, o que se torna mais óbvio se você pressionar uma tecla.
Uma alternativa pode ser usar o controle de fluxo de trabalho. ctrl + s
suspenderá um terminal e ctrl + q
o retomará. Isso bloqueia todo o shell e não funciona em todos os shells. Você pode usar ctrl + z
para suspender um processo, dando-lhe um prompt de volta e usar fg
para retomar o processo novamente, o que lhe permite continuar usando o shell.