Làm thế nào để tạo một hình ảnh động xoay bằng shell script?


10

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 /, -, |\.

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:


20

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 whilevòng lặp chạy vô hạn. Các forchạy vòng lặp trough mỗi ký tự của chuỗi được đưa ra trong $chars. echoin 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. -ebuộ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.


Khéo léo, +1, nhưng tại sao không printf "%s\r" "${chars:$i:1}"?
terdon

1
@terdon nghĩ đầu tiên là echo... nhưng tất nhiên printfcũng hoạt động. ^^
hỗn loạn

20

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.


7
Mã tuyệt vời. Tôi sẽ thực hiện một sửa đổi nhỏ, mặc dù. Sau khi chạy 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
dberm22

1

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, symbolslà 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.