2012-03-13 8 views
5

私はbashファイルを持っていました。このファイルは、ユーザーに何らかのパラメータを入力させ、何も与えなければデフォルトを使いました。その後、スクリプトはパラメータとともに他のコマンドを実行しました。 これは素晴らしく、最近の追加までは問題ありませんでした。whileループの読み取り行の中でユーザーから読み取る方法は?

txtファイルからNAMESパラメータを読み取ろうとすると、ファイルの名前を取り込むためにwhileループを追加しましたが、残りのパラメータの入力を求められます。

しかし、whileループを追加すると、出力にはget_ans()で印刷されたプロンプトが表示され、読み込みが一時停止されることはなく、すべてのデフォルトが選択されます。

私は、ファイルから最初のパラメータを読み込み、それからすべての後続ファイルがユーザにプロンプ​​トされないようにしたいと思います。

whileループを追加することで何が壊れましたか?

cat list.txt | 
while read line 
do 
    get_ans "Name" "$line" 
    read NAME < $tmp_file 

    get_ans "Name" "$line" 
    read NAME < $tmp_file 
done 

function get_ans 
{ 
    if [ -f $tmp_file ]; then 
    rm $tmp_file 

    PROMPT=$1 
    DEFAULT=$2 

    echo -n "$PROMPT [$DEFAULT]: " 
    read ans 
    if [ -z "$ans" ]; then 
    ans="$DEFAULT" 
    fi 
    echo "$ans" > $tmp_file 
} 

(注:コードは非常にタイプミスを言い訳してください&ペーストをコピーされていない実際のコードは、メインの前に定義された関数()がある。)は、コマンドライン上の他に

+0

私は受け入れる決定を下す前に、それがあるだけで何も問題がない_solve_する方法を説明します一つは、あなたの他の回答()を見てみたいです。 –

答えて

3

データをwhileループSTDINにパイプします。したがって、readget_ansも、そのSTDINストリームからデータを取得しています。

あなたは別のファイルディスクリプタの中にパイプデータの問題を回避し、一時ファイルを悩ま停止することができます。

while read -u 9 line; do 
    NAME=$(get_ans Name "$line") 
done 9< list.txt 

get_ans() { 
    local PROMPT=$1 DEFAULT=$2 ans 
    read -p "$PROMPT [$DEFAULT]: " ans 
    echo "${ans:-$DEFAULT}" 
} 
+0

<&9を読みながら取得しました –

1

いつパイプコマンドを1つ、のように:

$ foo | bar 

シェルはbarの標準出力の標準入力がfooから来ている "ようにそれを設定しようとしています。 fooがstdoutに送信するものは、barのstdinに直接送られます。

あなたの場合、スクリプトが読むことができるのは、ファイルの内容を含むcatコマンドの標準出力だけです。

コマンドラインでパイプを使用する代わりに、ファイル名をスクリプトの最初のパラメータにします。次に、コード内のファイルを開いて読み込み、通常どおりユーザーから読み取ります。

+0

大丈夫です、それは理にかなっています。 –

+0

ありがとうございました。パイプを外し、読み込み中に使用しました。 $ 1を実行していますが、まだ入力の読み込みをスキップしています。 –

3

端末からではなく、標準入力から直接読み取るためには、(あなたがにしていると仮定すると* NIXマシンではなく、Windowsマシン):

while read foo</some/file; do 
    read bar</dev/tty 
    echo "got <$bar>" 
done 
関連する問題