Як створити анімацію обертання за допомогою сценарію оболонки?


10

Шукаю скрипт , який створює анімацію обертання з допомогою символу /, -, |і \.

Якщо ви постійно перемикаєтесь між цими символами, це має виглядати як його обертовий. Як це зробити?

Відповіді:


21

Використовуйте цей сценарій:

#!/bin/bash

chars="/-\|"

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

whileЦикл виконується нескінченно. В forзапускає цикл корита кожен символ рядка заданої в $chars. echoдрукує персонаж із зворотним перевезенням \r, але без розриву рядків -n. -eзмушує відлуння для інтерпретації послідовностей втечі, таких як \r. Між кожною зміною існує затримка на 0,5 секунди.


Розумний, +1, але чому б і ні printf "%s\r" "${chars:$i:1}"?
тердон

1
@terdon спочатку подумав echo... але, звичайно, printfтеж працює. ^^
хаос

20

Ось приклад використання \b, який повідомляє емулятору терміналу переміщати курсор на один стовпець ліворуч, щоб продовжувати перезапис того самого символу знову і знову.

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

Див. BashFAQ 34 для отримання додаткової інформації.


7
Чудовий код. Я б зробив одну невелику модифікацію. Після запуску spinner &я б зберігав pid у локальній змінній, spinner_pid=$!а потім замінював виклик kill наkill $spinner_pid &>/dev/null
dberm22

Хочеться додати tput civis #hide cursorіtput cnorm #show cursor
Іштіяк Хусейн

1

Оскільки ви прямо не просите баш, трохи штепсельної шкаралупи для рибної шкаралупи , де це можна красиво вирішити IMO:

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

У цьому випадку symbolsє змінною масиву, і вміст, якщо він повертається / зміщується, тому що $symbols[2..-1]це всі записи, окрім першого.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.