如何使用Shell脚本创建旋转动画?


10

我要寻找的是使用字符创建一个旋转动画的脚本/-|\

如果您在这些字符之间连续切换,它看起来应该像旋转的一样。怎么做?

Answers:


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循环运行低谷中给出的字符串的每个字符$charsecho打印字符,带有回车符\r,但不换行-n-e强制回声来解释逃逸序列,例如\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 $spinner_pid &>/dev/null
dberm22

我想补充tput civis #hide cursortput cnorm #show cursor
Ishtiyaq侯赛因

1

由于您没有明确要求bash,因此可以在fish壳上塞一些塞子,在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]除了第一个条目以外所有条目都是。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.