tentando passar várias linhas, uma por uma (cada linha tem 3 itens separados por um espaço) inseridos em um script já escrito

1

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
    
por Liv 06.10.2016 / 03:54

2 respostas

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

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
    
por 06.10.2016 / 13:49