파일 내용을 매개변수로 bash 스크립트에 전달

파일 내용을 매개변수로 bash 스크립트에 전달

Bash 스크립트에서 다음을 수행하고 싶습니다.

script.sh < some_file

파일 some_file에는 한 줄이 있으며 이를 bash에 매개 변수로 전달하고 싶습니다 script.sh. 어떻게 해야 하나요?

답변1

세 가지 변형:

  1. 명령줄에서 파일 내용을 전달하고 스크립트에서 사용합니다.
  2. 명령줄에 파일 이름을 전달하고 스크립트의 파일에서 읽습니다.
  3. 파일 내용을 표준 입력으로 전달한 다음 스크립트에서 표준 입력을 읽습니다.

내용을 명령줄 인수로 전달합니다.

$ ./script.sh "$(<some_file)"

스크립트 내부:

some_data=$1

$1첫 번째 명령줄 인수의 값이 됩니다.

데이터가 너무 많으면 실패합니다(셸이 실행해야 하는 명령이 너무 커짐).


패스 파일 이름:

$ ./script.sh some_file

스크립트 내부:

some_data=$(<"$1")

또는

IFS= read -r some_data <"$1"

표준 입력을 파일에 연결합니다.

$ ./script.sh <some_file

스크립트 내부:

IFS= read -r some_data

이 접근 방식의 단점은 이제 스크립트의 표준 입력이 에 연결된다는 것입니다 some_file. 그러나 스크립트 사용자에게 파일이나 파이프에서 표준 입력 데이터를 전달할 때 많은 유연성을 제공합니다.

답변2

cat some_file | ./script.sh `xargs` 

답변3

Bash 쉘 인용에 대한 걱정을 피하려면 xargs를 사용하여 인수를 통해 전체 파일을 있는 그대로 전달하십시오(여러 줄 파일도 포함).

cat input-file | xargs -0 -I XX mycommand arg1 --foo XX arg3

는 제가 선택한 자리 표시자 입니다 XX. 명령줄 어디에도 나타나지 않는 한( input-file텍스트를 입력하려는 위치 제외) 무엇이든 될 수 있습니다.

-0줄 끝이 구분 기호로 사용되지 않도록 입력 파일을 null 문자로 구분하도록 xargs에 지시합니다. 이렇게 하면 전체 파일이 단일 인수로 전달됩니다(파일에 텍스트 파일에 포함되어서는 안되는 null 문자가 포함되어 있지 않은 경우).

스크립트를 제어할 수 있으므로 파일 이름을 매개변수로 전달하는 것은 어떨까요?

답변4

read셸 내장 기능을 사용하면 데이터를 읽고 stdin읽은 입력을 셸 변수에 저장할 수 있습니다.

$ echo foo bar baz | read a b c
$ echo $a
foo
$ echo $b
bar
$ echo $c
baz

보시 read다시피 분할이 필드에 입력됩니다. 입력의 분할 위치는 변수 $IFS(입력 필드 구분 기호). null로 설정하면 $IFS입력 분할이 비활성화되고 전체 라인을 변수에 저장할 수 있습니다.

$ echo foo bar baz | IFS= read foo
$ echo $foo
foo bar baz

관련 정보