我有一个脚本,一一提出 3 个问题。我需要一种方法来批量运行这个脚本而不需要重新编写它。该脚本运行时如下所示:
./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 个项目,然后继续到下一行。
该文件以空格分隔。该文件看起来像这样
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
如果您的 shell 支持数组,那么可以使用 shell 循环将每行中以空格分隔的项读取到数组中,然后使用换行符将它们打印到程序的标准输入。例如,给定一个交互式测试脚本(这将被您的替换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 ...
在你的情况下,由于你的文件中有空格分隔的条目,我看不出有什么理由阻止 shell 应用 split+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