파일을 반복하고 행을 위치 매개변수로 다른 파일로 보냅니다.

파일을 반복하고 행을 위치 매개변수로 다른 파일로 보냅니다.

다음 형식의 날짜(dates.txt라는 이름)가 포함된 파일을 반복하고 싶습니다.

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

그리고 각 줄의 각 필드를 위치 매개변수로 다른 스크립트에 전달합니다.

즉, 다른 스크립트는 명령줄에 다음을 입력하여 실행됩니다.

$ . the_script 2009 08 03 08 09

나는 시도했다for i in $(./dates.txt);do echo ${i};done

하지만 다음을 얻으세요:

./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found

이것으로부터 나는 그것이 각 라인을 통해 작동하고 있지만 아마도 각 필드에서 끊기는 것을 알 수 있습니다.

위의 내용으로 인해 나는 읽은 줄을 위치 매개변수로 다른 스크립트에 전달하는 방법을 아직 알아낼 ​​수 없었습니다. 어느 곳에서 작업해야 할지 모르시나요? 도와주세요!

답변1

아마도 이런 뜻이겠죠?

while read -d $'\n' i; do echo $i;done <./dates

while read -d $'\n' i; do . the_script $i;done <./dates

답변2

소싱( .)이 필요하지 않은 경우 이 작업은 다음과 같은 작업처럼 들립니다.xargs:

xargs -a dates.txt -rL1 the_script
  • xargs입력 라인을 읽은 다음 이를 지정된 명령에 대한 인수로 사용합니다. 기본 줄 구분 기호는 개행 문자입니다.
  • 다른 명령에서 데이터를 파이프로 연결하거나 -a.
  • 스크립트 호출당 정확히 한 줄이 사용되므로 -r(줄이 비어 있으면 실행하지 않음) 및 -L(호출당 최대 N 줄 사용) 옵션을 지정합니다.

답변3

cat명령에 사용 하고 스크립트가 동일한 디렉터리에 없는 경우 파일 이름에 대한 올바른 경로를 사용하는지 확인하십시오. 목록이 dates.txt다음과 같은 경우 $(cat ./dates.txt).여기서 오타를 수정했습니다. .txt를 포함하세요.

예는 다음과 같습니다.

이름이 지정된 날짜 목록입니다 dates.txt.

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

lstdates.sh해당 목록의 행성을 에코하도록 명명된 스크립트입니다 .편집됨 이는 내부 필드 구분 기호(IFS)에 대한 하위 셸에서 실행됩니다.1서브쉘 외부에서는 변경되지 않습니다.2.

#!/bin/bash
# Listing each date as an argument for `the_script`.

# Parenthesis runs in a subshell    
( 
  # IFS line break
  IFS=$'\012'
  for dates in $(cat ./dates.txt)
  do
    echo $(./the_script $dates)
  done
)

기본적으로 IFS는 각 공백을 필드의 끝으로 인식합니다. IFS=$'\012'각 새 줄을 필드의 끝으로 인식합니다. 각 줄을 와 같은 큰따옴표로 묶으면 "2009 08 03 08 09"기본 IFS가 작동합니다.

the_script다음 내용만 포함됩니다.

#!/bin/bash
echo $1

참조:고급 Bash 스크립팅 가이드 11장. 루프와 분기

관련 정보