
file.txt의 내용(이상하지 않음, POSIX에서 정의한 텍스트 파일)
iguana
gecko
anole
샘플 스크립트:
#!/bin/sh
string="$(cat file.txt)"
printf '%s' "$string"
샘플 출력:
[coolguy@somemachine ~]$ ./script.sh
iguana
gecko
anole[coolguy@somemachine ~]$
마지막 개행 문자는 어떻게 되었나요? 마지막 줄을 제외하고 모두 개행 문자가 보존되는 이유는 무엇입니까? 개행이 이미 있는 경우에는 개행을 추가하기 위해 echo를 사용할 필요가 없는 것 같습니다.
답변1
인쇄가 아니라 이를 수행하는 명령 대체입니다. 그렇게 하도록 정의되어 있습니다. 로부터POSIX 설명:
쉘은 서브쉘 환경에서 명령을 실행하고 명령 대체를 명령의 표준 출력으로 대체하여 명령 대체를 확장합니다.대체 끝에서 하나 이상의 {newline} 문자 시퀀스 제거.
제거되니 참고하세요모두하나가 아닌 후행 줄 바꿈.
다소 일반적인 경우에는 명령 대체를 사용하여 한 줄 출력을 캡처합니다 osrev=$(uname -r)
. 유틸리티는 일반적으로 명령줄에서 사용자 편의를 위해 후행 줄 바꿈을 인쇄합니다. 그러나 쉘 스크립트에서는 해당 문자열을 다른 문자열(예: 파일 이름)의 일부로 사용하고 싶을 수도 있습니다 filename=blahblah-$osrev.dat
. 그리고 이 경우, 후행 개행 문자는 성가신 일이 될 뿐입니다.
그리고 물론, echo
어떠한 경우에도 일반에는 최종 개행 문자가 추가됩니다.
변수에 있는 파일의 내용을 그대로 유지하려는 경우 일반적인 해결 방법은 명령 대체에 추가 문자를 추가하고 나중에 제거하는 것입니다.
printf "foo\nbar\n\n" > file
string=$(cat file; echo x)
string=${string%x}
printf '%q\n' "$string"
그 출력은 $'foo\nbar\n\n'
후행 줄 바꿈이 모두 있음을 보여줍니다.
데이터로 수행하려는 작업에 따라 다른 방법이 있을 수 있습니다. 예를 들어 파일을 한 줄씩 처리하려는 경우 while read
루프 또는 Bash의 .mapfile