Tôi đang tìm kiếm một kịch bản tạo ra một hình ảnh động luân chuyển nhân vật sử dụng /
, -
, |
và \
.
Nếu bạn liên tục chuyển đổi giữa các ký tự này, nó sẽ trông giống như xoay của nó. Làm thế nào để thực hiện điều này?
Tôi đang tìm kiếm một kịch bản tạo ra một hình ảnh động luân chuyển nhân vật sử dụng /
, -
, |
và \
.
Nếu bạn liên tục chuyển đổi giữa các ký tự này, nó sẽ trông giống như xoay của nó. Làm thế nào để thực hiện điều này?
Câu trả lời:
Sử dụng tập lệnh đó:
#!/bin/bash
chars="/-\|"
while :; do
for (( i=0; i<${#chars}; i++ )); do
sleep 0.5
echo -en "${chars:$i:1}" "\r"
done
done
Các while
vòng lặp chạy vô hạn. Các for
chạy vòng lặp trough mỗi ký tự của chuỗi được đưa ra trong $chars
. echo
in nhân vật, với một sự trở lại vận chuyển \r
, nhưng không có ngắt dòng -n
. -e
buộc echo để giải thích các chuỗi thoát như \r
. Có độ trễ 0,5 giây giữa mỗi thay đổi.
echo
... nhưng tất nhiên printf
cũng hoạt động. ^^
Dưới đây là một ví dụ sử dụng \b
, cho biết trình giả lập thiết bị đầu cuối di chuyển con trỏ một cột sang trái, để giữ ghi đè lên cùng một ký tự.
#!/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'
Xem BashFAQ 34 để biết thêm.
spinner &
, tôi sẽ lưu trữ pid trong một biến cục bộ spinner_pid=$!
và sau đó thay thế lệnh gọi bằngkill $spinner_pid &>/dev/null
Vì bạn không yêu cầu bash rõ ràng, hãy cắm một ít cho vỏ cá , nơi điều này có thể được giải quyết một cách tuyệt vời IMO:
set -l symbols ◷ ◶ ◵ ◴
while sleep 0.5
echo -e -n "\b$symbols[1]"
set -l symbols $symbols[2..-1] $symbols[1]
end
Trong trường hợp này, symbols
là một biến mảng và nội dung nếu nó được xoay / dịch chuyển, bởi vì $symbols[2..-1]
tất cả các mục trừ đầu tiên.
printf "%s\r" "${chars:$i:1}"
?