Como criar uma animação de rotação usando o shell script?


10

Eu estou procurando um script que cria uma animação de rotação usando caráter /, -, |e \.

Se você alternar continuamente entre esses caracteres, deve parecer que está girando. Como fazer isso?

Respostas:


21

Use esse script:

#!/bin/bash

chars="/-\|"

while :; do
  for (( i=0; i<${#chars}; i++ )); do
    sleep 0.5
    echo -en "${chars:$i:1}" "\r"
  done
done

O whileloop corre infinito. O forloop passa por cada caractere da string fornecida em $chars. echoimprime o caractere, com um retorno de carro \r, mas sem quebra de linha -n. -eforça o eco a interpretar seqüências de escape como \r. Há um atraso de 0,5 segundos entre cada alteração.


Inteligente, +1, mas por que não printf "%s\r" "${chars:$i:1}"?
Terdon #

1
O primeiro pensamento de @terdon foi echo... mas é claro que printftambém funciona. ^^
caos

20

Aqui está um exemplo de uso \b, que diz ao emulador de terminal para mover o cursor uma coluna para a esquerda, a fim de continuar substituindo o mesmo caractere repetidamente.

#!/usr/bin/env bash

spinner() {
    local i sp n
    sp='/-\|'
    n=${#sp}
    printf ' '
    while sleep 0.1; do
        printf "%s\b" "${sp:i++%n:1}"
    done
}

printf 'Doing important work '
spinner &

sleep 10  # sleeping for 10 seconds is important work

kill "$!" # kill the spinner
printf '\n'

Veja BashFAQ 34 para mais.


7
Ótimo código. Eu faria uma pequena modificação, no entanto. Depois de correr spinner &, eu iria armazenar o PID em uma variável local spinner_pid=$!e, em seguida, substituir a chamada de matar comkill $spinner_pid &>/dev/null
dberm22

1

Como você não solicita explicitamente o bash, um pequeno plug para a casca do peixe , onde isso pode ser resolvido lindamente na IMO:

set -l symbols    
while sleep 0.5
    echo -e -n "\b$symbols[1]"
    set -l symbols $symbols[2..-1] $symbols[1]
end

Nesse caso, symbolsé uma variável de matriz e o conteúdo, se for girado / deslocado, porque $symbols[2..-1]são todas as entradas, exceto a primeira.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.