Bagaimana cara membuat animasi rotasi menggunakan skrip shell?

10

Saya mencari script yang menciptakan animasi rotasi menggunakan karakter /, -, |dan \.

Jika Anda terus beralih di antara karakter-karakter ini, ia akan terlihat seperti berputar. Bagaimana cara membuatnya?

Platypus Anonim
sumber

Jawaban:

21

Gunakan skrip itu:

#!/bin/bash

chars="/-\|"

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

The whileloop berjalan tak terbatas. The forloop berjalan palung setiap karakter dari string yang diberikan dalam $chars. echomencetak karakter, dengan carriage return \r, tetapi tanpa linebreak -n. -ememaksa gema untuk menafsirkan urutan melarikan diri seperti \r. Ada penundaan 0,5 detik antara setiap perubahan.

kekacauan
sumber
Pintar, +1, tetapi mengapa tidak printf "%s\r" "${chars:$i:1}"?
terdon
1
@terdon pikir pertama adalah echo... tapi tentu saja printfberhasil juga. ^^
kekacauan
20

Berikut ini contoh penggunaan \b, yang memberi tahu emulator terminal untuk memindahkan kursor satu kolom ke kiri, agar terus menimpa karakter yang sama berulang kali.

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

Lihat BashFAQ 34 untuk lebih lanjut.

geirha
sumber
7
Kode yang bagus Saya akan membuat satu modifikasi kecil. Setelah berjalan spinner &, saya akan menyimpan pid dalam variabel lokal spinner_pid=$!dan kemudian mengganti panggilan kill dengankill $spinner_pid &>/dev/null
dberm22
1

Karena Anda tidak secara eksplisit meminta bash, sebuah sumbat kecil untuk cangkang ikan , tempat ini dapat diselesaikan dengan indah IMO:

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

Dalam hal ini, symbolsadalah variabel array, dan isinya jika diputar / digeser, karena $symbols[2..-1]semua entri tetapi yang pertama.

Pompei2
sumber