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