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