• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【シェル】ループの中で対話処理をしたい)

シェルでループの中で対話処理をしたい

このQ&Aのポイント
  • unix上でシェルを書いています。ループ内で対話形式で処理をしたいのですが、入力待ちとならないままループしてしまいます。
  • test.txtの内容を読み込んで年齢を入力してもらう処理です。入力があるまで処理を待たせる方法を知りたい。
  • 実行すると、入力を待たずに未入力となる問題が発生します。1行読んでから年齢の入力を待つ方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

良いかどうか別にして、対策案です。 read ymd < /dev/console と、する。

w_horse
質問者

お礼

ike-2000 様 ご回答誠にありがとうございます。 返信が遅れ、大変失礼いたしました。 出力されたものを変数に読み込ませるのですね! 思いつきませんでした、試してみます!

その他の回答 (3)

回答No.4

一応、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

w_horse
質問者

お礼

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

原因は < test.txt によって、標準入力が test.txt に切り替わっているために read ymd が、標準入力(= test.txt)から読みこもうとしてしまうからです。 よって、対策は #1のようにread ymd の入力として端末を直接指定するか、 while read line とread ymd とで入力を切り替えるか、 となります。 後者の方法は「ファイル ディスクリプタ while read」あたりで検索すると見付かります。

w_horse
質問者

お礼

kmee 様 ご回答誠にありがとうございます。 返信が遅れ、大変失礼いたしました。 ご丁寧なご説明、ありがとうございます。 モヤモヤがきれいに解消いたしました。 readはキーボードからの入力ではなくて、ファイルから読み込もうとしていたのですね! なるほど……。 一番目の方に教えて頂いた方法で実装をしてみます。 また、もう一つの後者のやり方についても、後学のため、調べてみます。「while read」という検索キーで検索していたのですが、どうも希望のものが見つからなかったのですが、今実際に検索してみたところ、これだ!と思うものにヒットしました。 これからよく読んでみます。 どうもありがとうございました。

回答No.2

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

w_horse
質問者

お礼

MillenniuM 様 ご回答誠にありがとうございます。 返信が遅れ、申し訳ありません。 readのオプションがあるのは知りませんでした。 bashスクリプトですので、こちらも試してみます。

関連するQ&A

専門家に質問してみよう