Wie erstelle ich eine Rotationsanimation mit einem Shell-Skript?

10

Ich bin auf der Suche nach einem Skript , das eine Rotation Animation mit Charakter schafft /, -, |und \.

Wenn Sie kontinuierlich zwischen diesen Zeichen wechseln, sollte es so aussehen, als würde es sich drehen. Wie macht man das?

Anonymes Schnabeltier
quelle

Antworten:

21

Verwenden Sie dieses Skript:

#!/bin/bash

chars="/-\|"

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

Die whileSchleife läuft unendlich. Die forSchleife durchläuft jedes Zeichen der in angegebenen Zeichenfolge $chars. echodruckt das Zeichen mit einem Wagenrücklauf \r, jedoch ohne Zeilenumbruch -n. -ezwingt das Echo, Escape-Sequenzen wie z \r. Zwischen jeder Änderung liegt eine Verzögerung von 0,5 Sekunden.

Chaos
quelle
Clever, +1, aber warum nicht printf "%s\r" "${chars:$i:1}"?
Terdon
1
@terdon erster Gedanke war echo... aber printffunktioniert natürlich auch. ^^
Chaos
20

Hier ist ein Beispiel mit \b, das den Terminalemulator anweist, den Cursor eine Spalte nach links zu bewegen, um das gleiche Zeichen immer wieder zu überschreiben.

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

Weitere Informationen finden Sie in BashFAQ 34 .

Geirha
quelle
7
Großartiger Code. Ich würde jedoch eine kleine Änderung vornehmen. Nach dem Ausführen spinner &würde ich die PID in einer lokalen Variablen speichern spinner_pid=$!und dann den Kill-Aufruf durchkill $spinner_pid &>/dev/null
dberm22
1

Da Sie nicht explizit nach Bash fragen, ein kleiner Stecker für die Fischschale , wo dies wunderbar gelöst werden kann IMO:

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

In diesem Fall symbolshandelt es sich um eine Array-Variable und den Inhalt, wenn sie gedreht / verschoben wird, da $symbols[2..-1]alle Einträge außer dem ersten sind.

Pompei2
quelle