Ler várias entradas de um arquivo de entrada

2

Eu escrevi um programa em Fortran que me pede latitude e longitude e o nome do arquivo de saída toda vez que eu o executo. Isso funciona muito bem. O que eu tenho a intenção de fazer é executar este programa para todo o globo (ou seja, 65341 total combinação diferente possível). Eu estou tendo dificuldade em fazer isso com scripts de shell. Alguém pode me dar algumas dicas? Até agora eu tenho andado por aí com um arquivo de entrada, mas o programa lê as três primeiras entradas do arquivo de entrada (lat, lon e o nome do arquivo) e para. O que seria excelente é se eu pudesse escrever um script fonte que seja algo como o seguinte:

$ ./myprogram < lat1, lon1, filename1

$ ./myprogram < lat2, lon2, filename2

No entanto, o sinal < apenas é alimentado no arquivo de entrada. Existe uma maneira parecida de alimentar os valores de entrada em vez do arquivo de entrada?

    
por Luju 31.07.2014 / 04:17

2 respostas

1

O Bash suporta documentos aqui e here strings para fornecer entrada padrão para um programa a partir de uma string. O seguinte:

./myprogram <<EOT
$lat1
$lon1
$filename1
EOT

fornecerá myprogram três linhas de entrada, que são os valores das variáveis lat1 , lon1 e filename1 . Se você colocar dentro de um loop que define as variáveis apropriadamente a cada vez, você executará myprogram muitas vezes, com entradas padrão diferentes toda vez.

<<EOT marca um documento aqui: significa ler as linhas a seguir até que uma apenas diga " EOT " e forneça isso como entrada padrão para o programa (como < faz para um arquivo). Você pode usar o que quiser no lugar de EOT , desde que seja o mesmo em ambos os lugares.

Você também pode usar uma string aqui:

./myprogram <<<"$lat
$lon
$filename"

Isso faz a mesma coisa, mas com um literal de cadeia de várias linhas. <<<"..." pega a string dada e a transmite como entrada padrão como acima. Eu preferiria a versão heredoc, no entanto.

Uma abordagem alternativa que funciona mesmo em POSIX sh é apenas criar o arquivo apropriado:

echo $lat > file
echo $lon >> file
echo $filename >> file
./myprogram < file

O documento aqui é melhor se você puder usá-lo, no entanto, o que eu suponho que você pode, já que isso é marcado como "bash".

Uma opção ainda mais usa \n escapes e echo ou printf :

printf '%s\n%s\n%s\n' "$lat" "$lon" "$filename" | ./myprogram
echo -e "$lat\n$lon\n$filename" | ./myprogram

-e é uma extensão comum para echo que o Bash e outros shells suportam. printf deve funcionar em qualquer sistema compatível com POSIX.

    
por 31.07.2014 / 04:49
0

A maneira fácil (e portátil) de alimentar múltiplas linhas de entrada para um programa é

{
  echo 'lat1'
  echo 'lon1'
  echo 'filename1'
} | ./myprogram

Uma abordagem alternativa é usar um documento aqui .

    
por 01.08.2014 / 01:54