8

シェルスクリプトでユーザーから複数のアイテムを読み取ろうとしていますが、うまくいきません。最初にファイルのリストを読み取り (stdin パイプから読み取られる)、次に 2 回読み取って対話的に 2 つの文字列を取得することを意図しています。私がやろうとしているのは、電子メールに添付するファイルのリスト、次に件名、最後に電子メールの本文を読むことです。

これまでのところ、私はこれを持っています:

photos=($(< /dev/stdin))

echo "Enter message subject"
subject=$(< /dev/stdin)

echo "Enter message body"
body=$(< /dev/stdin)

(さらに、簡潔にするために省略したエラー チェック コード)

ただし、これはおそらく 2 番目と 3 番目のリダイレクトが EOF を取得するため、空の件名と本文を取得します。

<&- などを使用して標準入力を閉じて再度開き直そうとしましたが、そのようには機能しないようです。

「while; read line」ループを使用してファイルのリストに区切り記号を使用し、区切り記号が検出されたときにループから抜け出そうとしました。しかし、それもうまくいきませんでした(??)。

このようなものを構築する方法はありますか?

4

4 に答える 4

6

だから私がやったことは、ezpzの答えとこのドキュメントに基づいてい ます: http://www.faqs.org/docs/abs/HTML/io-redirection.html次に、dup-and-close トリックを使用して stdin を読み取ります。

# close stdin after dup'ing it to FD 6
exec 6<&0

# open /dev/tty as stdin
exec 0</dev/tty

# now read the fields
echo "Enter message subject"
read subject
echo "Enter message body"
read body

# done reading interactively; now read from the pipe
exec 0<&6 6<&-
photos=($(< /dev/stdin))

ありがとう!

于 2010-01-02T21:44:07.470 に答える
3

read件名と本文のプロンプトを表示するために使用できるはずです。

photos=($(< /dev/stdin))

read -rp "Enter message subject" subject

read -rp "Enter message body" body
于 2010-01-02T19:01:12.027 に答える
2

さまざまな数の写真がある可能性があるため、最初に既知のフィールドを入力してから、「その他すべて」を読んでみませんか。インタラクティブな方法で未知の長さの最後の 2 つのフィールドを取得しようとするよりもはるかに簡単です。

于 2010-01-02T18:35:49.537 に答える