ユーザー入力後にテキストが消えるようにする

ユーザー入力後にテキストが消えるようにする

ユーザーがコンテンツを入力するとすぐに表示されたコンテンツを消去する方法はありますか?

たとえば、次のファイルを使用します。

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

答え1

キャリッジリターン(\r)を使用してください。この特殊文字(機械式タイプライター時代の文字)は、カーソルを行の先頭に戻します。その後、削除するメッセージと同じくらいのスペースが必要になり(これを行うとメッセージが上書きされます)、次のメッセージを印刷する前に2番目のキャリッジリターンを使用して最初に戻ります。このような:

#!/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あります:(また))echotctermcapterminfo elechotc ceechoti elzsh

答え3

これを行う方法は、愚かさからエレガントなものまでさまざまです。

(最も難しいですが)最も確実な方法は、バックスペース、スペース、バックスペースを押して何度も繰り返すことです。この方法は、テレタイププライターを除くすべてのデバイスで機能します(紙からインクを取り除くのは難しいことです)。

次の比率は、キャリッジリターンスペースとキャリッジリターンです。これは、各キャリッジリターンの前後に改行を挿入するターミナルエミュレータでは機能しません(これはminicomのオプションであり、他のデバイスではこれを持つように設定できます)。

その後、ターミナル固有のトリックがあります。 termcapデータベースとterminfoデータベースが使用法を表示する可能性があるので、termcapの機能コードだけに言及します。(リストです。)

単一行の場合は簡単です。列(ch)に移動して行の終わり(ce)まで消去します。

複数行の応答を含むより複雑な場合は、絶対位置の保存(sc)、プロンプト、応答の読み取り、カーソル位置の復元(rc)、画面の最後まで消去(cd)があります。

ほとんどの場合、ほとんどの端末エミュレータは互換性があるため、最後の2つの回答のvt100値をハードコードできます。もちろん、すべての端末がこれらのオプションをサポートしているわけではありませんが、サポートしている端末はまれで役に立ちません。

関連情報