여러 매개변수를 bash 스크립트로 구문 분석

여러 매개변수를 bash 스크립트로 구문 분석

여기에 게시된 솔루션 중 일부를 시도했지만 아무 소용이 없습니다. 나는 이것이 당신이 쉽게 발견할 수 있고 내가 얼굴을 손바닥으로 대할 수 있는 내가 놓친 어리석고 명백한 일이기를 바랍니다.

데이터 분석을 위한 여러 명령이 포함된 bash 스크립트가 있습니다. 명령줄에서 이 스크립트를 실행하면 다음과 같이 표시됩니다(단순화).

./script.sh /path/to/file1.gz /path/to/file2.gz output_name

script.sh처음 두 매개변수는 데이터 분석 명령에 필요한 파일의 경로입니다. 예상 한 대로 output_name는 마지막 출력 파일의 이름입니다.

이것은 잘 작동하지만 각각 새 줄에 여러 파일 경로가 있는 파일을 갖고 파일의 각 줄을 반복하고 스크립트를 순서대로 실행하고 싶습니다. 따라서 매개변수 파일은 다음과 같습니다.

/path/to/file1.gz /path/to/file2.gz output_name1

모든 라인에.

그런 다음 while 루프를 통해 각 줄을 스크립트에 입력합니다(이것이 최고라고 생각합니다).

나는 시도했다:

while read -r line; do; ./script.sh; done < arg_list.txt

arg_list.txt가 입력 인수 목록을 포함하는 파일인 경우 "파일을 열 수 없습니다."라는 메시지가 표시됩니다.

내가 멍청하고 뭔가 빠졌다고 자유롭게 말해 주세요!

답변1

자신만의 구조를 사용하여 한 줄에 공백으로 구분된 세 개의 값을 읽고 이를 스크립트의 인수로 사용합니다.

while read -r in1 in2 out
do
    ./script.sh "$in1" "$in2" "$out"
done < arg_list.txt

답변2

입력 파일의 내용이 올바르게 인용되었다고 가정하면(인수에 공백, 탭 또는 줄 바꿈이 포함된 경우) xargs다음과 같이 사용할 수 있습니다.

xargs -n 3 ./script.sh <arg_list.txt

이번에는 입력에서 세 개의 매개변수를 읽고 이를 사용하여 스크립트를 호출합니다.

세 개의 매개변수 세트는 입력 파일의 같은 줄에 나열될 필요가 없습니다. xargs세 개의 매개변수는 같은 줄에 있는지 또는 2~3줄에 걸쳐 있는지 여부에 관계없이 읽고 스크립트를 호출하는 데 사용됩니다.

예( printf스크립트 대신 명령 사용):

$ cat file
/path/to/file1.gz /path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
'/path/to/file 1.gz' /path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
/path/to/file1.gz
/path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
$ xargs -n 3 printf 'Arg1: "%s", Arg2: "%s", Arg3: "%s"\n' <file
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file 1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"

답변3

실제로 파일에 정확한 매개변수 목록이 포함되어 있으면 루프가 매우 단순해집니다.

while read
do
   ./script.sh $REPLY
done

REPLY변수는 자동 변수이며 지정하지 않으면 행을 필드로 분할하지 않으므로 그대로 사용할 수 있습니다 read. REPLY이 경우에는 따옴표가 없습니다. 파일에서 읽은 줄에 공백과 따옴표가 포함되어 있으면 파일에 있는 그대로 정확하게 명령으로 전송됩니다. 따라서 파일에 한 줄이 있으면 세 개의 매개변수와 마지막 매개변수에 공백이 a b "c d"있는 스크립트를 호출하게 됩니다 . script.sh a b "c d"따라서 파일 내에서 올바르게 참조되는지 확인해야 합니다.

파일에서 읽은 매개변수를 어떤 방식으로든 업데이트해야 하는 경우 더 자세한 작업을 수행할 수 있습니다 read.

while read f1 f2 f3
do
   ./script.sh "$f2" "$f1" "$f3.txt"
done

이 경우 파일의 참조 내용에도 주의하세요. 동일한 행에 대해 a b "c d"이 코드는 script.sh b a "c d".txt정확히 원하는 결과가 아닐 수도 있습니다.

매개변수가 있는 파일에 특이한 내용으로 구분된 필드가 포함되어 있는 경우 IFS먼저 특수 변수를 수정할 수 있습니다 read. read그런 다음 행은 해당 값으로 분할됩니다 IFS.

좀 더 복잡한 것이 필요한 경우에는 또는 또는 같은 전체 언어를 사용할 수도 xargs있습니다 . 많은 솔루션이 있습니다.awkperlpython

관련 정보