从输入文件读取多个条目

从输入文件读取多个条目

我用 Fortran 编写了一个程序,每次运行它时都会询问我的纬度和经度以及输出文件的名称。效果很好。我一直想做的是在整个地球上运行这个程序(即总共 65341 个不同的可能组合)。我很难用 shell 脚本来做到这一点。有人能给我一些指点吗?到目前为止,我一直在摆弄输入文件,但程序读取输入文件的前三个条目(纬度、经度和文件名)并停止。如果我可以编写一个如下所示的源脚本,那就太好了:

$ ./myprogram < lat1, lon1, filename1

$ ./myprogram < lat2, lon2, filename2

但是,该符号<仅输入输入文件中。有没有类似的方法来输入输入价值观而不是输入文件?

答案1

bash 支持这里的文件这里是字符串从字符串向程序提供标准输入。下列:

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

将给出三行输入,分别是、和变量myprogram的值。如果将其放入一个每次都适当设置变量的循环中,那么您将运行多次,每次都使用不同的标准输入。lat1lon1filename1myprogram

<<EOT标记此处文档:这意味着读取以下几行,直到有人说“ EOT”并将其作为程序的标准输入提供(就像<对文件所做的那样)。您可以使用任何您喜欢的内容来代替EOT,只要两个地方的值相同即可。

您还可以在此处使用字符串:

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

这做同样的事情,但用多行字符串文字代替。<<<"..."获取给定的字符串并将其作为标准输入传递,就像上面一样。不过,我更喜欢heredoc版本。


即使在 POSIX 中也可以使用的另一种方法sh是创建适当的文件:

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

不过,如果您可以使用这里的文档,那就更好了,我认为您可以,因为它被标记为“bash”。

还有一个选项使用\n转义符或者echo或者printf:

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

-eecho是Bash 和其他 shell 支持的常见扩展。printf应该可以在任何 POSIX 兼容系统上工作。

答案2

向程序提供多行输入的简单(且可移植)方法是

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

另一种方法是使用这里的文档

相关内容