
while readループ内での入力の読み取りは機能しないようです
while read line
do
echo "get some input from the user"
read response
done < some_file.txt
読み取りがループ外にあった場合のように実行が一時停止しません。これはなぜでしょうか? while read ループ内で入力を読み取るための回避策はありますか?
答え1
問題は、 と の両方read line
がread response
からデータを期待し、取得することですstdin
。
この質問SO では、その一部がさらに詳しい情報へのリンクとともに説明されています。
要約
受け入れられた答えは次のように示唆しています:
制御端末デバイスから読み取り:
read input </dev/tty
答え2
内部の読み取りコマンドで標準入力を使用し、while ループでは別のファイル記述子を使用する
while read -u 3 line; do
read -p "get some input from the user" response
done 3< some_file.txt
答え3
Nifle さん、ありがとう! bgStack にも感謝します。何時間も検索して、ようやく答えが見つかりました! 素晴らしいです! ターミナル パスを検出するために「echo $(tty)」を使用しましたが、単に変数として取得することもできます。私にとっては、これは別のユース ケースでした。ファイルを読み込んでいて、実行を確認したいのです。以下の例が他の誰かの役に立つかもしれません。
#!/bin/bash
export terminal=$(tty)
cat file | while read val1 val2
do
while true;
do
read -p "would you like to XYZ" yn
case $yn in
[Yy]* ) echo "# Move $val1 to $val2 #";break;;
[Nn]* ) echo "#---------no action----------#";break;;
* ) echo "# Please answer yes or no. #";;
esac
done < $terminal
done
答え4
Nifle はまさにその通りです。ただし、複数の端末を使用する場合は、具体的に指定する必要があります。
Google からアクセスした方、このページを見つけられてありがとうございます。while 読み取りループ中にユーザー入力を行う必要がある場合 (これにはrm -i
、、、read
その他が含まれます)、使用する入力パイプを指定できます。
以下は私が使用したこのソリューションの一部です。
#in declarations
thistty=$(tty)
lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
homedir=$(echo $homedir | awk -F= '{print $2}')
sudo rm -ir "$homedir" < $thistty
done