使文本在用户输入后消失

使文本在用户输入后消失

有没有办法让显示的内容在用户输入后立即消失?

例如,采用下面的这个文件

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

如果你运行这个,输出是

how are you ? yHave fun

我正在寻找能让我how are you ?在用户按下按键后立即消失的东西

然后消失后,打印Have fun

所以,我希望上述程序的最后输出只是

Have fun

注意:此外,在 shell 屏幕上打印的此脚本之上的任何内容都不应被删除。

我在用bash

答案1

使用回车符 ( \r)。这个特殊字符(机械打字机时代遗留下来的)会将光标移回行首。然后,您需要与要删除的消息一样多的空格(这将覆盖该消息),然后在打印下一条消息之前使用第二个回车符返回到开头。像这样的东西:

#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    printf '\r                \rHave fun\n'
else
    printf '\r                \rGo to Doctor\n'
fi

运行上面的脚本会打印:

$ foo.sh
foo
Have fun        

答案2

您可以使用:

tput cr

(或printf '\r')将光标移动到行首。其次是:

tput el

删除直到行尾的所有内容。 (tcsh并且zsh还具有echotc可以与termcap等效项一起使用的内置函数terminfo el:(echotc ce也在echoti elzsh

答案3

有很多方法可以做到这一点,从白痴证明到优雅。

最万无一失的方法(虽然最费力)是按退格键,按空格键,按退格键,重复多次。这种方法适用于除电传打字机之外的所有设备(从纸上去除墨水是一项挑战)。

接下来的比例是回车空格回车。这不适用于在每个回车之前或之后插入换行的终端仿真器(这是 minicom 的一个选项,其他可能配置为具有)。

然后是终端特定的技巧,我将仅提及 termcap 功能代码,因为 termcap 和 terminfo 数据库可以显示用法。(这是一个列表。)

对于单行来说很简单,就是移动到列 (ch),然后清除到行尾 (ce)。

对于更复杂的情况,包括多行响应,有保存绝对位置(sc)、提示、读取响应、恢复光标位置(rc)、清除到屏幕末尾(cd)。

在大多数情况下,您可以对最后两个答案的 vt100 值进行硬编码,因为大多数终端仿真器都与其兼容。当然,并非所有终端都支持这些选项,但那些不支持的终端很少见且已过时。

相关内容