cat file.txt | while read L ; do
L=($L)
./test.pl << EOF
${L[0]}
${L[1]}
${L[2]}
EOF
done
Eu tenho um script que faz três perguntas, uma por uma. Eu preciso de uma maneira de executar este script em massa sem reescrevê-lo. O script, quando executado, é assim:
./test.pl
question a and I answer with item1
question b and I answer with item2
question c and I answer with item3
então ele executa o script com os 3 campos preenchidos.
Agora, tenho o arquivo a ser executado; cada linha tem os 3 campos. Preciso que o script leia cada linha e, para cada linha, execute os 3 itens dessa linha, um por um, e depois passe para a próxima linha.
O arquivo é delimitado por espaço. O arquivo se parece com isso
item1 item2 item3
item1 item2 item3
Se o seu shell suportar arrays, então um deles seria ler os itens separados por espaço de cada linha em um array usando um loop de shell, e depois imprimi-los com novas linhas na entrada padrão do seu programa. Por exemplo, dado um script de teste interativo (isso será substituído pelo seu 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"
com um arquivo de respostas
$ cat answers
egg sausage bacon
egg bacon spam
spam spam spam
usando então 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
(o truque aqui é que printf
reutiliza o formato %s\n
único até que a lista de argumentos esteja esgotada, portanto, não precisamos especificar o número de itens explicitamente). O bom é que ele pode ser generalizado para outros delimitadores simplesmente alterando while read ...
para (por exemplo) while IFS=, read ...
No seu caso, como você tem entradas separadas por espaço em branco em seu arquivo, não vejo uma razão para evitar que o shell aplique split + glob, portanto, você pode evitar as matrizes e ler linhas inteiras e passá-las < em> un cotado para 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
Tags shell-script