Как создать анимацию вращения с помощью сценария оболочки?

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заставляет эхо интерпретировать escape-последовательности, такие как \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 для более.

geirha
источник
7
Отличный код. Я сделал бы одну маленькую модификацию, хотя. После запуска spinner &я spinner_pid=$!kill $spinner_pid &>/dev/null
сохранял
Я хотел бы добавить tput civis #hide cursorиtput cnorm #show cursor
Ishtiyaq Husain
1

Так как вы явно не просите bash, небольшой плагин для рыбной раковины , где это можно красиво решить 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]это все записи, кроме первой.

Pompei2
источник