Bash 스크립트에서 다음을 수행하고 싶습니다.
script.sh < some_file
파일 some_file
에는 한 줄이 있으며 이를 bash에 매개 변수로 전달하고 싶습니다 script.sh
. 어떻게 해야 하나요?
답변1
세 가지 변형:
- 명령줄에서 파일 내용을 전달하고 스크립트에서 사용합니다.
- 명령줄에 파일 이름을 전달하고 스크립트의 파일에서 읽습니다.
- 파일 내용을 표준 입력으로 전달한 다음 스크립트에서 표준 입력을 읽습니다.
내용을 명령줄 인수로 전달합니다.
$ ./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