쉘 스크립트를 사용하여 회전 애니메이션을 만드는 방법은 무엇입니까?


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. -eecho가와 같은 이스케이프 시퀀스를 해석하도록 \r합니다. 각 변경 사이에 0.5 초의 지연이 있습니다.


영리한 +1이지만 왜 그렇지 printf "%s\r" "${chars:$i:1}"않습니까?
terdon

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 call을kill $spinner_pid &>/dev/null
dberm22

내가 추가 tput civis #hide cursor하고 싶습니다tput cnorm #show cursor
Ishtiyaq Husain

1

명시 적으로 IMO를 해결할 수있는 물고기 껍질을 위한 작은 플러그 인 bash를 명시 적으로 요청하지 않기 때문에 :

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], 첫 번째 항목을 제외한 모든 항목 이므로 회전 / 이동 된 경우 내용 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.