- ベストアンサー
シェルでループの中で対話処理をしたい
- unix上でシェルを書いています。ループ内で対話形式で処理をしたいのですが、入力待ちとならないままループしてしまいます。
- test.txtの内容を読み込んで年齢を入力してもらう処理です。入力があるまで処理を待たせる方法を知りたい。
- 実行すると、入力を待たずに未入力となる問題が発生します。1行読んでから年齢の入力を待つ方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
良いかどうか別にして、対策案です。 read ymd < /dev/console と、する。
その他の回答 (3)
- MillenniuM
- ベストアンサー率58% (42/72)
一応、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
お礼
MillenniuM様 ご回答ありがとうございます。 回答が遅れ、大変申し訳ありません。 サンプルプログラムありがとうございます!! まさに私がやりたかったことです。 typesetを使う方法は全く思いつきませんでした。 大変勉強になりました。 誠にありがとうございました。
- kmee
- ベストアンサー率55% (1857/3366)
原因は < test.txt によって、標準入力が test.txt に切り替わっているために read ymd が、標準入力(= test.txt)から読みこもうとしてしまうからです。 よって、対策は #1のようにread ymd の入力として端末を直接指定するか、 while read line とread ymd とで入力を切り替えるか、 となります。 後者の方法は「ファイル ディスクリプタ while read」あたりで検索すると見付かります。
お礼
kmee 様 ご回答誠にありがとうございます。 返信が遅れ、大変失礼いたしました。 ご丁寧なご説明、ありがとうございます。 モヤモヤがきれいに解消いたしました。 readはキーボードからの入力ではなくて、ファイルから読み込もうとしていたのですね! なるほど……。 一番目の方に教えて頂いた方法で実装をしてみます。 また、もう一つの後者のやり方についても、後学のため、調べてみます。「while read」という検索キーで検索していたのですが、どうも希望のものが見つからなかったのですが、今実際に検索してみたところ、これだ!と思うものにヒットしました。 これからよく読んでみます。 どうもありがとうございました。
- MillenniuM
- ベストアンサー率58% (42/72)
bash スクリプトで良ければ、 read にオプション -n が使えるので、 簡単です。 read -n3 ymd とすれば、最大3文字まで、入力を待ちます。 bash なら、ポータビリティもそれほど失われないと思うので、 bash スクリプトにするのが良いと思います。
お礼
MillenniuM 様 ご回答誠にありがとうございます。 返信が遅れ、申し訳ありません。 readのオプションがあるのは知りませんでした。 bashスクリプトですので、こちらも試してみます。
お礼
ike-2000 様 ご回答誠にありがとうございます。 返信が遅れ、大変失礼いたしました。 出力されたものを変数に読み込ませるのですね! 思いつきませんでした、試してみます!