ฉันกำลังมองหาสคริปต์ที่สร้างภาพเคลื่อนไหวการหมุนโดยใช้ตัวละคร/
, -
, และ|
\
หากคุณสลับไปมาระหว่างตัวละครเหล่านี้อย่างต่อเนื่องมันควรจะมีลักษณะหมุนได้ ทำอย่างไร
ฉันกำลังมองหาสคริปต์ที่สร้างภาพเคลื่อนไหวการหมุนโดยใช้ตัวละคร/
, -
, และ|
\
หากคุณสลับไปมาระหว่างตัวละครเหล่านี้อย่างต่อเนื่องมันควรจะมีลักษณะหมุนได้ ทำอย่างไร
คำตอบ:
ใช้สคริปต์นั้น:
#!/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 วินาทีระหว่างการเปลี่ยนแปลงแต่ละครั้ง$chars
echo
\r
-n
-e
\r
echo
... แต่แน่นอนprintf
เกินไป ^^
นี่คือตัวอย่างการใช้\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เพิ่มเติม
spinner &
ฉันจะเก็บ pid ในตัวแปรท้องถิ่นspinner_pid=$!
แล้วแทนที่ kill call ด้วยkill $spinner_pid &>/dev/null
tput civis #hide cursor
และtput cnorm #show cursor
เนื่องจากคุณไม่ได้ขอให้ทุบตีอย่างชัดเจนจึงมีปลั๊กเล็ก ๆ สำหรับเปลือกหอยซึ่งสามารถแก้ไขได้อย่างสวยงาม 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]
เป็นรายการทั้งหมดยกเว้นรายการแรก
printf "%s\r" "${chars:$i:1}"
?