bashのプログラムにて、sleep 2s としてエラーメッセージを表示してから2秒後にループに戻る、という機能を実装しました。しかし、待っている2秒間に入力した文字が画面に出力され、次の入力にその文字が反映されてしまいます。さらに、入力した文字の分だけ削除することができてしまいます(画像参照)。これはsleepの使用上どうにもならないことでしょうか。
また、こういった誤入力を受け付けないようにするにはどのようにしたらいいでしょうか。
DrqYutoが👍を押しています
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答3件
0
入力文字を捨ててから表示するのはどうでしょうか?
bash
1#!/bin/bash 2function choice(){ 3 echo " $1" 4} 5while read -p "選択してください> " no ; do 6 case $no in 7 1 ) { 8 choice 1 9 };; 10 2 ) { 11 choice 2 12 };; 13 3 ) { 14 choice 3 15 };; 16 4 ) { 17 choice 4 18 };; 19 5 ) { 20 choice 5 21 };; 22 99 ) { 23 choice 99 24 break 25 };; 26 * ) { 27 echo "[エラー] 1~5 または99を選択してください" 28 read -t 2 -n 1000 discard 29 };; 30 esac 31done
投稿2017/08/17 03:57
編集2017/08/17 04:01総合スコア4070
0
キーの入力待ちは、readコマンドを使うといいですよ。
こちら(BASHシェルスクリプトで「キー入力待ち」プロンプトを実装する)が参考になるかと。
投稿2017/08/17 02:28
総合スコア25438
回答ありがとうございます。readコマンドでは-sを使って入力を出力しないでEnterキーでのみ終了する、といったところまでは実装できました。ただ、これを秒指定と組み合わせることはできませんでした。
秒指定って何です?sleepの間隔のことですか?
sleepは要らないんじゃないかと言いたかったのです。
良ければ、概略でもよいので、コードを追加してもらえると助かります。
秒指定=sleepという認識で大丈夫です。
確かに、sleepを使わないほうがスマートになると思うんですが2秒後に戻る、という問題文だったため使用しています。概略でもコードを載せたいのですが、sleepの部分以外は特に問題がないため追加すべきかがわからない、というのが現状です。
ああ、それなら他の方の回答にもあるように、-t(タイムアウト秒)オプションの指定ですけど、整数値で指定すれば大丈夫じゃないかと。
結局sleepコマンドは使わない方向にしました。
タイムアウトの指定でうまいこといったのでそちらを採用させていただきます。
0
ベストアンサー
ちょっとテストし切れてませんが、多分これで読み捨てられると思います。
Bash
1while read -t 0.001 -N 1 dmy 2do : 3done
投稿2017/08/17 02:28
総合スコア86608
回答ありがとうございます。
試してみましたが自分では理解できなかったため、解説していただけないでしょうか?
試して期待通りの動作だったのでしょうか?
いえ、試してみたところ、read invalid timeout specificationとエラーが出てしまい、うまくいきませんでした。
Bashのバージョンが古いのでしょうか?4.1.2だとうまく行きます。しかし今時それより古い物があるとも思えないのですが。
Bashのバージョンは、bash --version で。
わざわざご丁寧にありがとうございます。
Bashのバージョンは3.2.25です。どこにも記述していなかったのですが仮想環境で行っています。
なんとバージョン3とは。それって、OSもサポート切れの古いやつではないですか?
read -t 1 -N 1 dmy
で、エラーは出ないと思いますが、待ちが最大3秒になってしまいます。
read -t 1 -N 1 dmy
は、何かキーイン文字が入力済であればそれを読み捨て、何もキーイン済がなければ1秒間キーインを待ちます。
while ~ do : done で、それを入力済キーがある間繰り返します。
会社のPCなのでノーコメントでお願いします。。。
-Nが読み込むことができず、-nにしたところうまく動きました。入力文字は切り捨てられているので予期せぬ動作もなくなりました。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。


2017/08/17 07:37