在shell脚本中使用字符|,/,\, - 创建旋转圆

时间:2012-05-06 11:23:12

标签: shell

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

6 个答案:

答案 0 :(得分: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

}

将其粘贴到终端并输入“spin”。


更新:此版本适用于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
}

答案 1 :(得分:2)

echo -e 'abc\bd'
            ^^---backspace char

将输出

abd

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

答案 2 :(得分:2)

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

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

(注意,亚秒级睡眠不是便携式的,也不是seq。)

答案 3 :(得分:0)

这是 POSIX shell兼容版本:

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

请注意,作为副作用,您的x值将被覆盖。为了避免这种情况,请将说明纳入功能。

答案 4 :(得分:0)

由于你没有指定哪个shell,一个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]都是条目,但是第一个。

答案 5 :(得分:0)

为了详细说明@gavenkoa 的答案,变量扩展周围应该有双引号,这样我们应该得到一个原始但符合 POSIX 标准的微调器:

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

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