(これは間接的にはるかに大きな宿題の一部です)
私は次のようなものを持っています
LINEを読みながら 行う stuff-done-to- $ LINE echo「入力を入力してください:」 INPUTを読む stuff-done-to- $ INPUT 完了<infile
リダイレクトされたstdinの代わりに、2回目の読み取りにconsole /defaultstdinを使用する成功した方法が見つかりません。
純粋なボーンスクリプトである必要があります。
これはBourneシェルでサポートされていると思います。
exec 3<doc.txt
while read LINE <&3
do
stuff-done-to-$LINE
# the next two lines could be replaced by: read -p "Enter input: " INPUT
echo "Enter input:"
read INPUT
stuff-done-to-$INPUT
done < infile
入力はファイルとユーザーの間で交互に行われます。実際、これはファイルから一連のプロンプトを発行するための優れた方法です。
これにより、ファイル「infile」がファイル記述子番号3にリダイレクトされ、そこから最初のファイルread
が入力されます。ファイル記述子0はstdin
、1はstdout
、2はstderr
です。他のFDを一緒に使用できます。
私はこれをBashとDashでテストしました(私のシステムではshはdashにシンボリックされています)。
もちろん動作します。ここにもう少し楽しいものがあります:
exec 3<doc1.txt
exec 4<doc2.txt
while read line1 <&3 && read line2 <&4
do
echo "ONE: $line1"
echo "TWO: $line2"
line1=($line1) # convert to an array
line2=($line2)
echo "Colors: ${line1[0]} and ${line2[0]}"
done
これにより、2つのファイルの内容を交互に印刷し、どちらか長い方のファイルの余分な行を破棄します。
ONE: Red first line of doc1
TWO: Blue first line of doc2
Colors: Red and Blue
ONE: Green second line of doc1
TWO: Yellow second line of doc2
Colors: Green and Yellow
Doc1には2行しかありません。doc2の3行目以降は破棄されます。
/ dev / ttyを介してユーザーの端末を読み取り/書き込みできます。これは、使用しているシェルやstdin / stdoutがリダイレクトされるかどうかに依存しないため、次のものが必要です。
echo "Enter input:" > /dev/tty
read INPUT < /dev/tty
これは機能するはずです:
for LINE in `cat infile`; do
stuff-done-to-$LINE
echo "Enter input:"
read INPUT
stuff-done-to-$INPUT
done
できません。デフォルトのstdinとリダイレクトされたstdinはありません。stdinがあり、接続先はコンソールまたはファイルのいずれかです。
あなたができる唯一のことはあなたのファイルの行数のカウンターを使用している間することです。次に、sedまたはtail+headを賢く使用して各行を抽出します。while read line
コンソールからの読み取りとファイルからの読み取りを区別する方法がないため、使用できません。