脚本需要一个非常简单的循环

脚本需要一个非常简单的循环

尝试编写一个使用 Charles Karney 的脚本GeodSolve来解决直接的测地线问题。 GeodSolve 接受输入:lat1 lon1 azi1 dist1,输出:lat2 lon2 azi2。

我有一个文件(“azi_dist_file”),分别在第一列和第二列中包含方位角和距离。在下面的简单脚本中,要求用户提供初始位置 lat1 和 lon1,而 azi1 和 dist1 是从 azi_dist_file 中获取的。然后,程序GeodSolve将解决直接测地线问题并返回端点位置 lat2 lon2 (以及此处不相关的 azi2);我希望将第二个位置用作进一步调用 的初始位置GeodSolve,但从 azi_dist_file 的第二行获取 azi2 和 dist2;重复直到到达该文件中的最后一行。最后,我希望将所有纬度、经度、方位角、距离值写入一个新文件。

到目前为止,我已经成功写出了以下内容。

#!/bin/bash
echo "Enter starting latitude: "
read lat1
echo "Enter starting longitude: "
read lon1
alpha1=`awk 'NR==1{print;exit}' azi_dist_file|cut -f1 -d$'\t'`
dist1=`awk 'NR==1{print;exit}' azi_dist_file|cut -f2 -d$'\t'`
echo "$lat1 $lon1 $alpha1 $dist1" >> lat_lon_azi_dist_file
echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve
lat2=`echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve | cut -f1 -d' '`
lon2=`echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve | cut -f2 -d' '`
echo "$lat2 $lon2"

答案1

听起来你想要类似的东西:

#!/bin/bash -
# lat/lon passed as arguments to the script instead of being input to the
# user:
lat=${1?} lon=${2?}

while read alpha dist ignore; do
  printf '%s\n' "$lat $lon $alpha $dist" >&3
  read lat lon ignore < <(
    printf '%s\n' "$lat $lon $alpha $dist" | GeodSolve 3>&-)
  printf '%s\n' "$lat $lon"
done < azi_dist_file 3> lat_lon_azi_dist_file

read vars < <(cmd)是为了解决以下事实:在bash(与zshAT&T相反ksh)中cmd | read varsread命令在子 shell 中运行。或者,对于最新版本的bash,您可以在本例中使用类似于或 的shopt -s lastpipe行为。bashzshksh

POSIXly,您还可以使用:

unset -v IFS; set -f; set -- $(cmd); lat=$1 lon=$2

相关内容