Comment créer une animation de rotation en utilisant un script shell?


10

Je suis à la recherche d'un script qui crée une animation de rotation à l' aide de caractère /, -, |et \.

Si vous basculez continuellement entre ces caractères, cela devrait ressembler à sa rotation. Comment faire ça?

Réponses:


21

Utilisez ce script:

#!/bin/bash

chars="/-\|"

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

La whileboucle est infinie. La forboucle parcourt chaque caractère de la chaîne donnée dans $chars. echoimprime le caractère, avec un retour chariot \r, mais sans saut de ligne -n. -eforce l'écho à interpréter des séquences d'échappement telles que \r. Il y a un délai de 0,5 seconde entre chaque changement.


Intelligent, +1, mais pourquoi pas printf "%s\r" "${chars:$i:1}"?
terdon

1
@terdon a d'abord pensé echo... mais bien sûr, ça printfmarche aussi. ^^
chaos

20

Voici un exemple d'utilisation \b, qui indique à l'émulateur de terminal de déplacer le curseur d'une colonne vers la gauche, afin de continuer à écraser le même caractère encore et encore.

#!/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'

Voir BashFAQ 34 pour en savoir plus.


7
Excellent code. Je voudrais cependant apporter une petite modification. Après l'exécution spinner &, je stockais le pid dans une variable locale spinner_pid=$!, puis remplaçais l'appel kill parkill $spinner_pid &>/dev/null
dberm22

1

Puisque vous ne demandez pas explicitement bash, un petit plug pour la coquille de poisson , où cela peut être résolu magnifiquement IMO:

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

Dans ce cas, symbolsest une variable de tableau, et le contenu s'il est tourné / décalé, car ce $symbols[2..-1]sont toutes les entrées sauf la première.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.