プロが教える店舗&オフィスのセキュリティ対策術

unix上でシェルを書いています。
ループ内で対話形式で処理をしたいのですが、入力待ちとならないままループしてしまいます。
ループの中で、キーボードからの入力があるまで処理を待たせることは可能でしょうか。

  test.txtの内容***
花子
太郎
二郎
三郎
  ***************


このテキストを読み込んで年齢を入力してもらうという処理です。
読んだ後の処理はここでは省略します。
while read line;
do
   echo $line "この人の年齢を入力して下さい。"
   read ymd
   
       if [ "$ymd" = "" ]; then
     echo "未入力です!"
     exit 0
       fi
done < test.txt

これを実行すると、入力をまたずに未入力、未入力、未入力…と標準出力されます。
1行読んだら、年齢を聞いて、入力があるまでは"read ymd"の処理を行わない、という
ようにする方法をどうかご教授願います。

A 回答 (4件)

良いかどうか別にして、対策案です。



read ymd < /dev/console

と、する。
    • good
    • 0
この回答へのお礼

ike-2000 様
ご回答誠にありがとうございます。
返信が遅れ、大変失礼いたしました。

出力されたものを変数に読み込ませるのですね!
思いつきませんでした、試してみます!

お礼日時:2014/03/15 10:11

一応、bash での例を書いてみます。



#!/bin/bash -ex
typeset -ag NAME=($(cat test.txt))
typeset -ag YMD
typeset -i i
for (( i = 0; i < ${#NAME[@]}; i++)); do
echo "${NAME[i]} この人の年齢を入力して下さい。"
typeset -i ymd
read ymd
YMD[i]=${ymd}
done
for ((i = 0; i < ${#NAME[@]}; i++)); do
echo ${NAME[i]} ${YMD[i]}
done
    • good
    • 0
この回答へのお礼

MillenniuM様

ご回答ありがとうございます。
回答が遅れ、大変申し訳ありません。

サンプルプログラムありがとうございます!!
まさに私がやりたかったことです。
typesetを使う方法は全く思いつきませんでした。
大変勉強になりました。
誠にありがとうございました。

お礼日時:2014/03/16 08:32

原因は


< test.txt
によって、標準入力が test.txt に切り替わっているために
read ymd
が、標準入力(= test.txt)から読みこもうとしてしまうからです。


よって、対策は
#1のようにread ymd の入力として端末を直接指定するか、
while read line とread ymd とで入力を切り替えるか、
となります。

後者の方法は「ファイル ディスクリプタ while read」あたりで検索すると見付かります。
    • good
    • 0
この回答へのお礼

kmee 様
ご回答誠にありがとうございます。
返信が遅れ、大変失礼いたしました。

ご丁寧なご説明、ありがとうございます。
モヤモヤがきれいに解消いたしました。
readはキーボードからの入力ではなくて、ファイルから読み込もうとしていたのですね!
なるほど……。


一番目の方に教えて頂いた方法で実装をしてみます。

また、もう一つの後者のやり方についても、後学のため、調べてみます。「while read」という検索キーで検索していたのですが、どうも希望のものが見つからなかったのですが、今実際に検索してみたところ、これだ!と思うものにヒットしました。
これからよく読んでみます。

どうもありがとうございました。

お礼日時:2014/03/15 10:22

bash スクリプトで良ければ、


read にオプション -n が使えるので、
簡単です。
read -n3 ymd
とすれば、最大3文字まで、入力を待ちます。
bash なら、ポータビリティもそれほど失われないと思うので、
bash スクリプトにするのが良いと思います。
    • good
    • 0
この回答へのお礼

MillenniuM 様
ご回答誠にありがとうございます。
返信が遅れ、申し訳ありません。

readのオプションがあるのは知りませんでした。
bashスクリプトですので、こちらも試してみます。

お礼日時:2014/03/15 10:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!