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