입력 파일에서 여러 항목 읽기

입력 파일에서 여러 항목 읽기

나는 실행할 때마다 위도와 경도, 그리고 출력 파일의 이름을 묻는 프로그램을 Fortran으로 작성했습니다. 좋은 결과. 내가 하려고 했던 것은 이 프로그램을 지구 전체에 걸쳐 실행하는 것이었습니다(즉, 총 65,341개의 서로 다른 가능한 조합). 쉘 스크립트로 이 작업을 수행하는 데 문제가 있습니다. 누구든지 나에게 조언을 줄 수 있습니까? 지금까지 입력 파일을 만지작거렸지만 프로그램이 입력 파일의 처음 세 항목(위도, 경도 및 파일 이름)을 읽고 중지됩니다. 다음과 같은 소스 스크립트를 작성할 수 있다면 좋을 것 같습니다.

$ ./myprogram < lat1, lon1, filename1

$ ./myprogram < lat2, lon2, filename2

그러나 이 기호는 <입력 파일에만 입력됩니다. 입력하는 비슷한 방법이 있나요?가치입력 파일 대신?

답변1

배쉬 지원여기에 파일그리고여기 문자열이 있습니다문자열에서 프로그램에 표준 입력을 제공합니다. 다음과 같은:

./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

-eechoBash 및 기타 쉘에서 지원되는 공통 확장입니다. printf모든 POSIX 호환 시스템에서 작동해야 합니다.

답변2

프로그램에 여러 줄의 입력을 제공하는 간단하고 이식 가능한 방법은 다음과 같습니다.

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

또 다른 방법은여기 문서.

관련 정보