ユーザーがコンテンツを入力するとすぐに表示されたコンテンツを消去する方法はありますか?
たとえば、次のファイルを使用します。
#!/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
あります:(また))echotc
termcap
terminfo
el
echotc ce
echoti el
zsh
答え3
これを行う方法は、愚かさからエレガントなものまでさまざまです。
(最も難しいですが)最も確実な方法は、バックスペース、スペース、バックスペースを押して何度も繰り返すことです。この方法は、テレタイププライターを除くすべてのデバイスで機能します(紙からインクを取り除くのは難しいことです)。
次の比率は、キャリッジリターンスペースとキャリッジリターンです。これは、各キャリッジリターンの前後に改行を挿入するターミナルエミュレータでは機能しません(これはminicomのオプションであり、他のデバイスではこれを持つように設定できます)。
その後、ターミナル固有のトリックがあります。 termcapデータベースとterminfoデータベースが使用法を表示する可能性があるので、termcapの機能コードだけに言及します。(リストです。)
単一行の場合は簡単です。列(ch)に移動して行の終わり(ce)まで消去します。
複数行の応答を含むより複雑な場合は、絶対位置の保存(sc)、プロンプト、応答の読み取り、カーソル位置の復元(rc)、画面の最後まで消去(cd)があります。
ほとんどの場合、ほとんどの端末エミュレータは互換性があるため、最後の2つの回答のvt100値をハードコードできます。もちろん、すべての端末がこれらのオプションをサポートしているわけではありませんが、サポートしている端末はまれで役に立ちません。