用户输入后使文本消失


9

有没有一种方法可以使显示的内容在用户输入后立即消失?

例如,在下面获取此文件

#!/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

注意:此外,在外壳屏幕上打印的该脚本之上的所有内容都不应删除。

我在用 bash


2
clearechos 之间使用s不是一种选择?
sebasth

1
否,clear如果有的话,将清除屏幕上方已经打印的输出。@sebasth
GypsyCosmonaut

哪里Are you fine来的?那不是How are you吗?
Barmar

@Barmar是的,对不起,这是错误的,现在已更正
GypsyCosmonaut

Answers:


12

您可以使用:

tput cr

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

tput el

删除直到行末的所有内容。(tcsh并且zsh也有echotc,你可以通过使用内置termcap的是相当于terminfo elechotc ce(也echoti elzsh))


14

使用回车符(\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        

1
\r您可以将\rHave fun和之间的所有空格替换为两个,而不是两个\n
Barmar

2

有多种方法可以做到这一点,从傻瓜证明到优雅。

最简单的方法(尽管工作量最大)是退格键退格键,但是需要多次重复。这适用于电传打字机以外的所有设备(从纸上清除墨水是一个挑战)。

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

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

对于单行,简单的是移到列(ch),然后清除到行尾(ce)。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.