4

(これは間接的にはるかに大きな宿題の一部です)

私は次のようなものを持っています

    LINEを読みながら
    行う
        stuff-done-to- $ LINE
        echo「入力を入力してください:」
        INPUTを読む
        stuff-done-to- $ INPUT
    完了<infile

リダイレクトされたstdinの代わりに、2回目の読み取りにconsole /defaultstdinを使用する成功した方法が見つかりません。

純粋なボーンスクリプトである必要があります。

4

4 に答える 4

3

これは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行目以降は破棄されます。

于 2009-09-07T16:26:33.397 に答える
2

/ dev / ttyを介してユーザーの端末を読み取り/書き込みできます。これは、使用しているシェルやstdin / stdoutがリダイレクトされるかどうかに依存しないため、次のものが必要です。

echo "Enter input:" > /dev/tty
read INPUT < /dev/tty
于 2009-09-09T12:14:55.583 に答える
1

これは機能するはずです:

for LINE in `cat infile`; do
   stuff-done-to-$LINE
   echo "Enter input:"
   read INPUT
   stuff-done-to-$INPUT
done
于 2009-09-06T12:04:43.530 に答える
-2

できません。デフォルトのstdinとリダイレクトされたstdinはありません。stdinがあり、接続先はコンソールまたはファイルのいずれかです。

あなたができる唯一のことはあなたのファイルの行数のカウンターを使用している間することです。次に、sedまたはtail+headを賢く使用して各行を抽出します。while read lineコンソールからの読み取りとファイルからの読み取りを区別する方法がないため、使用できません。

于 2009-09-06T11:14:07.840 に答える