จะสร้างภาพเคลื่อนไหวการหมุนโดยใช้เชลล์สคริปต์ได้อย่างไร


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 พิมพ์ตัวอักษรที่มีการกลับรถแต่ไม่มี LINEBREAK กองกำลังสะท้อนการตีความลำดับหนีเช่น มีความล่าช้า 0.5 วินาทีระหว่างการเปลี่ยนแปลงแต่ละครั้ง$charsecho\r-n-e\r


เคลฟเวอร์ 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:

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.