스크립트에는 매우 간단한 루프가 필요합니다.

스크립트에는 매우 간단한 루프가 필요합니다.

GeodSolve직접적인 측지선 문제를 해결하기 위해 Charles Karney를 사용하여 스크립트를 작성해 보십시오 . GeodSolve는 입력: lat1 lon1 azi1 dist1, 출력: lat2 lon2 azi2를 허용합니다.

첫 번째 열과 두 번째 열에 각각 방위각과 거리가 포함된 파일("azi_dist_file")이 있습니다. 아래의 간단한 스크립트에서는 사용자에게 초기 위치 lat1 및 lon1을 제공하도록 요청하고 azi1 및 dist1은 azi_dist_file에서 가져옵니다. 그런 다음 프로그램은 GeodSolve직접 측지선 문제를 해결하고 끝점 위치 lat2 lon2(및 여기서는 관련이 없는 azi2)를 반환합니다. 두 번째 위치를 추가 호출의 초기 위치로 사용하고 싶지만 GeodSolveazi_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

이는 AT& T 와 달리 명령 이 하위 쉘에서 실행 된다는 read vars < <(cmd)사실을 설명하기 위한 것입니다 . 또는 최신 버전의 경우 이 경우와 유사한 동작을 사용할 수 있습니다 .bashzshkshcmd | read varsreadbashshopt -s lastpipebashzshksh

POSIXly에서는 다음을 사용할 수도 있습니다.

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

관련 정보