找到了一个很棒的[转义序列指南][1],并想在这里展开一些讨论。
当你写到终端时,你会移动一个不可见的光标,就像你在任何文本编辑器中写一样。使用时echo
,它会自动以换行符结束输出,将光标移动到下一行。
$ echo "Hello" && echo " World"
Hello
World
您可以使用-n
来阻止新行,如果您在此之后再次回显,它将附加到该行的末尾
$ echo -n "Hello" && echo " World"
Hello World
光标保持在原来的位置,就它自己而言,我们不能用它-n
来覆盖上一行,我们需要将光标向左移动。为此,我们需要给它一个转义序列,让我们echo
知道我们将使用它,然后通过提供一个将光标放在行首的-e
回车来移动光标。\r
$ echo -n "Hello" && echo -e "\rWorld"
World
这可能看起来有效,但看看会发生什么
$ echo -n "A longer sentance" && echo -e "\rShort sentance"
Short sentancence
看到多余的字符了吗?简单地写在行上只会改变我们写它们的字符。
为了解决这个问题,上面接受的答案\e[0K
在光标向左移动后使用转义字符擦除光标后的所有内容。即\r
移动到开始\e[0K
擦除结束。
$ echo -n "A longer sentance" && echo -e "\r\e[0KShort sentance"
Short sentance
重要 \e
的是开始转义序列适用于zsh
但不适用sh
且不一定适用于bash
,但\033
适用于所有转义序列。如果你想让你的脚本在任何地方工作,你应该优先\033
$ echo -n "A longer sentance" && echo -e "\r\033[0KShort sentance"
Short sentance
但是转义字符可以提供更多的实用性。例如\033[1A
,将光标移动到上一行,这样我们就不需要-n
上一个回显:
$ echo "A longer sentance" && echo -e "\r\033[1A\033[0KShort sentance"
Short sentance
\r
移到开头\033[1A
上移\033[0K
擦除到结尾
最后,这在我的书中有点乱,所以你可以把它变成一个函数:
overwrite() { echo -e "\r\033[1A\033[0K$@"; }
using$@
只是将函数的所有参数放入字符串中
$ echo Longer sentance && overwrite Short sentence
Short sentence
希望对想了解更多的人有所帮助。[1]:https ://shiroyasha.svbtle.com/escape-sequences-a-quick-guide-1