尝试将多行逐一传递到已编写的脚本中(每行有 3 个项目,以空格分隔)

尝试将多行逐一传递到已编写的脚本中(每行有 3 个项目,以空格分隔)

我有一个脚本,一一提出 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

相关内容