파일을 반복하고 행을 위치 인수로 다른 파일에 보냅니다.

파일을 반복하고 행을 위치 인수로 다른 파일에 보냅니다.

다음 형식의 날짜가 포함된 파일(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

.Sourcing()이 필요하지 않은 경우 직업처럼 들립니다.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장 루프 및 분기

관련 정보