6

我想编写一个执行安装相关任务的 shell 脚本。我想通过打印字符 |、/、\、- 来显示一些图标,例如旋转圆圈。一旦安装完成,这个圆圈就会消失。对此的任何帮助将不胜感激。

4

6 回答 6

4

基于 Marc B 的回答,这里有一个简单的演示:

spin () {

  chars="| / – \\"

  rotations=3

  delay=0.1

  for i in `seq 0 $rotations`; do

    for char in $chars; do 

      echo -ne $char
      sleep $delay
      echo -ne '\b'

    done

  done

}

将其粘贴到您的终端并输入“旋转”。


更新:此版本适用于 bash 和 zsh。

spin () {

  char=( \| / – \\ )

  charLastIndex=3

  rotations=3

  delay=0.1

  for i in `seq 1 $rotations`; do

    for j in `seq 0 $charLastIndex`; do 

      echo -n ${char[$j]}
      sleep $delay
      echo -ne '\b'

    done

  done

}

更新:liori 的版本在多个 shell 中工作。

spin () {
  rotations=3
  delay=0.1
  for i in `seq 0 $rotations`; do
    for char in '|' '/' '-' '\'; do
      #'# inserted to correct broken syntax highlighting
      echo -n $char
      sleep $delay
      printf "\b"
    done
  done
}
于 2012-05-06T12:09:30.960 回答
2
echo -e 'abc\bd'
            ^^---backspace char

将输出

abd

所以基本上你会输出一个动画字符,然后输出一个退格,然后输出下一个字符,等等......

于 2012-05-06T11:26:44.727 回答
2

公认的解决方案过于复杂。你可以这样做:

while sleep 1; do 
  i=$((++i%4 + 2)); 
  printf '\b|/-\' | cut -b 1,$i | tr -d '\n';
done

(请注意,亚秒级睡眠不可移植,seq 也不可移植。)

于 2012-05-06T16:14:17.657 回答
0

这是POSIX shell 兼容版本:

while true; do for x in '|' '/' '-' '\'; do printf '\b$x'; sleep 1; done; done

请注意,作为副作用,您的值x将被覆盖。为了避免这种情况,请将指令包含在函数中。

于 2016-01-18T14:28:22.167 回答
0

由于您没有指定哪个外壳,因此可以使用数组非常优雅地完成fish shell的一个小插件:

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]除了第一个之外都是所有条目。

于 2017-09-25T20:32:12.880 回答
0

为了详细说明@gavenkoa 的答案,变量扩展应该有双引号,这样我们应该得到一个原始但工作的 POSIX 兼容微调器:

while true; do for x in '|' '/' '-' '\'; do printf "\b$x"; sleep 1; done; done

(这可能不值得单独回答,但我还不允许发表评论,并且在尝试编辑旧答案时,它说编辑队列已满。)

于 2021-04-06T19:01:04.937 回答