すでに作成されたスクリプトに複数の行を1つずつ渡してみてください(1行に3つの項目、スペースで区切ります)。

すでに作成されたスクリプトに複数の行を1つずつ渡してみてください(1行に3つの項目、スペースで区切ります)。

3つの質問を1つずつ尋ねるスクリプトがあります。このスクリプトを再構築することなく一括で実行できる方法が必要です。実行時のスクリプトは次のとおりです。

./test.pl
question a   and I answer with item1
question b   and I answer with item2
question c   and I answer with item3

次に、3つのフィールドを埋めるスクリプトを実行します。

これで実行したいファイルがありました。各行には3つのフィールドがあります。各行を読み取り、各行に対してその行の3つの項目を1つずつ実行してから、次の行に進むにはスクリプトが必要です。

ファイルはスペースで区切られます。ファイルは次のとおりです

item1 item2 item3

item1 item2 item3

答え1

cat file.txt | while read L ; do
    L=($L)
    ./test.pl << EOF
    ${L[0]}
    ${L[1]}
    ${L[2]}
    EOF
done

答え2

シェルが配列をサポートしている場合は、シェルループを使用して各行のスペースで区切られた項目を配列に読み込み、改行文字を使用してプログラムの標準入力として印刷できます。たとえば、対話型テストスクリプトが与えられた場合(これはあなたのスクリプトに置き換えられますtest.pl

$ cat test.sh
#!/bin/bash

read -p "Item 1: " item1
read -p "Item 2: " item2
read -p "Item 3: " item3

printf "Items: %s, %s, %s\n" "$item1" "$item2" "$item3"

応答ファイルを含める

$ cat answers
egg sausage bacon
egg bacon spam
spam spam spam

その後、使用bash

while read -r -a items; do printf '%s\n' "${items[@]}" | ./test.sh; done < answers
Items: egg, sausage, bacon
Items: egg, bacon, spam
Items: spam, spam, spam

(ここでの秘密は、引数リストが使い果たされるまで単一のprintf形式%s\nを再利用することですので、項目数を明示的に指定する必要はありません。)利点は、while read ...単に次のように変更して別の区切り記号に一般化できることです。while IFS=, read ...

あなたの場合、ファイルにスペースで区切られた項目があるため、シェルが分割+globを適用するのを防ぐ理由がないため、配列を避け、行全体を読み取って渡すことができます。連合国見積printf

while read -r line; do printf '%s\n' $line | ./test.sh; done < answers
Items: egg, sausage, bacon
Items: egg, bacon, spam
Items: spam, spam, spam

関連情報