我用 Fortran 编写了一个程序,每次运行它时都会询问我的纬度和经度以及输出文件的名称。效果很好。我一直想做的是在整个地球上运行这个程序(即总共 65341 个不同的可能组合)。我很难用 shell 脚本来做到这一点。有人能给我一些指点吗?到目前为止,我一直在摆弄输入文件,但程序读取输入文件的前三个条目(纬度、经度和文件名)并停止。如果我可以编写一个如下所示的源脚本,那就太好了:
$ ./myprogram < lat1, lon1, filename1
$ ./myprogram < lat2, lon2, filename2
但是,该符号<
仅输入输入文件中。有没有类似的方法来输入输入价值观而不是输入文件?
答案1
bash 支持这里的文件和这里是字符串从字符串向程序提供标准输入。下列:
./myprogram <<EOT
$lat1
$lon1
$filename1
EOT
将给出三行输入,分别是、和变量myprogram
的值。如果将其放入一个每次都适当设置变量的循环中,那么您将运行多次,每次都使用不同的标准输入。lat1
lon1
filename1
myprogram
<<EOT
标记此处文档:这意味着读取以下几行,直到有人说“ EOT
”并将其作为程序的标准输入提供(就像<
对文件所做的那样)。您可以使用任何您喜欢的内容来代替EOT
,只要两个地方的值相同即可。
您还可以在此处使用字符串:
./myprogram <<<"$lat
$lon
$filename"
这做同样的事情,但用多行字符串文字代替。<<<"..."
获取给定的字符串并将其作为标准输入传递,就像上面一样。不过,我更喜欢heredoc版本。
即使在 POSIX 中也可以使用的另一种方法sh
是创建适当的文件:
echo $lat > file
echo $lon >> file
echo $filename >> file
./myprogram < file
不过,如果您可以使用这里的文档,那就更好了,我认为您可以,因为它被标记为“bash”。
printf '%s\n%s\n%s\n' "$lat" "$lon" "$filename" | ./myprogram
echo -e "$lat\n$lon\n$filename" | ./myprogram
-e
echo
是Bash 和其他 shell 支持的常见扩展。printf
应该可以在任何 POSIX 兼容系统上工作。