
unix上でシェルを書いています。
ループ内で対話形式で処理をしたいのですが、入力待ちとならないままループしてしまいます。
ループの中で、キーボードからの入力があるまで処理を待たせることは可能でしょうか。
test.txtの内容***
花子
太郎
二郎
三郎
***************
このテキストを読み込んで年齢を入力してもらうという処理です。
読んだ後の処理はここでは省略します。
while read line;
do
echo $line "この人の年齢を入力して下さい。"
read ymd
if [ "$ymd" = "" ]; then
echo "未入力です!"
exit 0
fi
done < test.txt
これを実行すると、入力をまたずに未入力、未入力、未入力…と標準出力されます。
1行読んだら、年齢を聞いて、入力があるまでは"read ymd"の処理を行わない、という
ようにする方法をどうかご教授願います。
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
MillenniuM様
ご回答ありがとうございます。
回答が遅れ、大変申し訳ありません。
サンプルプログラムありがとうございます!!
まさに私がやりたかったことです。
typesetを使う方法は全く思いつきませんでした。
大変勉強になりました。
誠にありがとうございました。
No.3
- 回答日時:
原因は
< test.txt
によって、標準入力が test.txt に切り替わっているために
read ymd
が、標準入力(= test.txt)から読みこもうとしてしまうからです。
よって、対策は
#1のようにread ymd の入力として端末を直接指定するか、
while read line とread ymd とで入力を切り替えるか、
となります。
後者の方法は「ファイル ディスクリプタ while read」あたりで検索すると見付かります。
kmee 様
ご回答誠にありがとうございます。
返信が遅れ、大変失礼いたしました。
ご丁寧なご説明、ありがとうございます。
モヤモヤがきれいに解消いたしました。
readはキーボードからの入力ではなくて、ファイルから読み込もうとしていたのですね!
なるほど……。
一番目の方に教えて頂いた方法で実装をしてみます。
また、もう一つの後者のやり方についても、後学のため、調べてみます。「while read」という検索キーで検索していたのですが、どうも希望のものが見つからなかったのですが、今実際に検索してみたところ、これだ!と思うものにヒットしました。
これからよく読んでみます。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力値が1以下、かつ数字以外の...
-
Linuxプログラミングで、キーボ...
-
数字以外が入力されたらエラー...
-
EDITコントロールで入力できる...
-
Eclipseでコマンドラインを入力...
-
C言語 逆ピラミッドの作り方
-
Yesならこっちへ、NOなら...
-
4桁の数字以外を入力したらエラ...
-
getcharをしながらwhile文で出...
-
java初心者です。入力されたの...
-
プログラミング初心者です。 Py...
-
C言語でのカレンダー作成
-
ワードで文字を入力する時の変...
-
*をユーザーが入力した数字の数...
-
C言語で、ioctlを使用し入力待...
-
C言語 While文(ループ)内の...
-
scanfが2回使えない・・・?;
-
fgets関数とscanfについて
-
getchar()について 教えてくだ...
-
VisualStudio2019のコードアナ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
scanfが2回使えない・・・?;
-
Excel VBAで、Application.Inpu...
-
"scanf"でエンターで改行させな...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
プログラミングの問題です 「金...
-
if文の条件にscanf関数を使うと…?
-
C言語でgetchar();が上手く使え...
-
UWSCで変数をキー入力
-
4桁の数字以外を入力したらエラ...
-
EDITコントロールで入力できる...
-
C言語でつるかめ算をするにはど...
-
Userformの入力順序をタブオー...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報