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?

Ornithorynque anonyme
la source

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.

le chaos
la source
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.

geirha
la source
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.

Pompei2
la source