Come creare un'animazione di rotazione usando lo script della shell?


10

Sto cercando uno script che crea un'animazione rotazione con carattere /, -, |e \.

Se si cambia continuamente tra questi personaggi, dovrebbe apparire come se ruotasse. Come farlo?

Risposte:


21

Usa quello script:

#!/bin/bash

chars="/-\|"

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

Il whileciclo è infinito. Il forciclo scorre attraverso ogni carattere della stringa fornita $chars. echostampa il personaggio, con un ritorno a \rcapo, ma senza interruzione di riga -n. -eforza l'eco per interpretare sequenze di escape come \r. C'è un ritardo di 0,5 secondi tra ogni modifica.


Intelligente, +1, ma perché no printf "%s\r" "${chars:$i:1}"?
terdon,

1
Il primo pensiero di @terdon è stato echo... ma ovviamente printffunziona anche. ^^
caos

20

Ecco un esempio usando \b, che dice all'emulatore di terminale di spostare il cursore di una colonna a sinistra, per continuare a sovrascrivere lo stesso carattere più volte.

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

Vedi BashFAQ 34 per di più.


7
Ottimo codice. Vorrei fare una piccola modifica, però. Dopo l'esecuzione spinner &, memorizzerei il pid in una variabile locale spinner_pid=$!e poi sostituivo la chiamata di kill $spinner_pid &>/dev/null
arresto

Vorrei aggiungere tput civis #hide cursoretput cnorm #show cursor
Ishtiyaq Husain

1

Dal momento che non chiedi esplicitamente bash, una piccola spina per il guscio di pesce , dove questo può essere risolto magnificamente IMO:

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

In questo caso, symbolsè una variabile di matrice e il contenuto se viene ruotato / spostato, perché $symbols[2..-1]sono tutte le voci tranne la prima.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.