HOWTO · Bash

Bash에서 여러 줄 문자열을 만드는 방법

Bash에서 여러 줄 텍스트를 만드는 다섯 가지 방법과 here-document, 변수, printf, 두 가지 echo 방식을 사용해 파일에 쓰는 방법을 알아봅니다.

이 페이지의 내용

Bash에서는 here-document, 변수, printf 또는 echo를 사용해 여러 줄의 텍스트를 파일에 쓸 수 있습니다. 다음 다섯 가지 예제에서 각 방법의 사용법과 상황에 맞는 선택 방법을 살펴봅니다. 짧고 고정된 텍스트라면 here-document를 사용하면 스크립트에서 내용을 읽기 쉽습니다. 텍스트를 미리 준비하거나 다시 사용해야 한다면 변수가 유용합니다. printf를 사용하면 줄바꿈을 명확하게 제어할 수 있고, 두 가지 echo 예제는 간단한 텍스트나 이스케이프 시퀀스에 적합합니다.

here-document를 사용해 Bash에서 여러 줄 문자열 만들기

here-document는 <<'EOF'와 짝이 되는 EOF 구분자 사이의 줄을 명령의 표준 입력으로 전달합니다. 여기서는 cat이 해당 줄을 읽고, >가 출력을 output.txt로 보내며, 파일이 이미 있으면 기존 내용을 덮어씁니다. 구분자를 따옴표로 감싸면 본문이 그대로 전달되므로 셸이 변수나 다른 표현식을 확장하지 않습니다. Bash가 본문의 끝을 알아볼 수 있도록 구분자는 단독으로 한 줄을 차지하게 하고 뒤에 다른 문자를 붙이지 마세요.

파일에는 다음 내용이 들어갑니다:

tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/output.txt"
cat > "$output_file" <<'EOF'
Hello
World
!
EOF
cat "$output_file"
Hello
World
!

이 명령은 파일에 직접 쓰므로 텍스트가 미리 정해져 있고 이전 내용을 교체해야 할 때 편리합니다. 기존 내용 뒤에 줄을 추가하려면 추가 리디렉션(>>)을 사용하세요. 스크립트에서는 쓰기 권한이 있는 경로를 선택하고 here-document의 시작과 끝에서 같은 구분자를 사용하세요. 본문 앞의 일반 공백은 유지됩니다. 들여쓰기된 소스 코드를 위해 Bash는 <<-도 지원합니다. 이 문법은 앞에 있는 탭 문자를 제거하지만 일반 공백은 제거하지 않습니다.

셸 변수를 사용해 Bash에서 여러 줄 문자열 만들기

따옴표로 감싼 변수 대입에는 실제 줄바꿈을 포함할 수 있습니다. 변수를 쓸 때 큰따옴표 안에서 확장하면 줄바꿈이 단어 분리로 처리되지 않고 하나의 문자열에 그대로 남습니다. 이 방식은 값을 한 번 조합한 뒤 여러 명령이나 파일에 전달할 때 유용합니다. 변수를 사용할 때마다 확장 부분을 따옴표로 감싸세요.

tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
greet="Hello,
World
!"
printf '%s\n' "$greet" > "$output_file"
cat "$output_file"
Hello,
World
!

따옴표로 감싼 "$greet" 확장은 변수에 들어 있는 줄바꿈을 보존합니다. 텍스트를 조합하거나 재사용한 뒤 파일에 쓸 때 유용한 방법입니다. 마지막 printf는 값 뒤에 줄바꿈을 추가합니다. 저장된 텍스트가 이미 줄바꿈으로 끝난다면 이 형식이 줄바꿈을 하나 더 추가합니다.

printf를 사용해 Bash에서 여러 줄 문자열 만들기

서식을 명확하게 제어하려면 printf를 사용하세요. %s\n 형식은 각 인수를 텍스트로 출력한 뒤 줄바꿈을 추가하며, >는 출력을 파일로 보냅니다. 각 인수가 별도의 줄이 되므로 입력값과 출력의 관계를 쉽게 파악할 수 있습니다.

tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
printf '%s\n' 'Hello' ',' 'World' '!' > "$output_file"
cat "$output_file"
Hello
,
World
!

printf는 전달된 단어를 서식 지시자로 해석하지 않고 데이터로 처리하므로 임의의 텍스트에도 예측 가능하게 동작합니다. % 문자가 포함될 수 있는 값과 서식 문자열은 분리해서 사용하세요. 입력이 이미 하나의 멀티라인 변수라면 변수 값을 서식 문자열에 넣지 말고 printf '%s\n' "$greet"처럼 하나의 인수로 전달하세요.

echo를 -e 옵션과 함께 사용해 Bash에서 여러 줄 문자열 만들기

-e 옵션을 사용하면 echo가 \n 같은 이스케이프 시퀀스를 해석합니다. 고정된 텍스트를 간결하게 표현할 수 있지만 셸마다 echo -e의 동작이 다를 수 있습니다. 셸이 달라도 서식이 일관되어야 한다면 printf를 사용하세요. 다음 예제는 이스케이프 시퀀스를 따옴표로 감싼 인수에 넣고, 결과 텍스트를 파일로 리디렉션합니다.

tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
echo -e 'Hello\n,\nWorld\n!' > "$output_file"
cat "$output_file"
Hello
,
World
!

작은따옴표는 echo가 해석하기 전까지 백슬래시 시퀀스를 그대로 유지합니다. 리디렉션은 결과로 만들어진 줄을 파일에 씁니다. 이 옵션의 동작은 셸에 따라 달라지므로 여러 셸 환경에서 같은 서식을 만들어야 하는 스크립트에서는 이 형식에 의존하지 마세요.

echo를 사용해 Bash에서 여러 줄 문자열 만들기

변수에 실제 줄바꿈이 이미 들어 있다면 따옴표로 감싼 echo "$greet"는 이스케이프 시퀀스를 해석하지 않고 해당 줄바꿈을 그대로 출력합니다. 이는 백슬래시 시퀀스와 -e를 사용하는 방법과 다릅니다. 간단한 값에 편리하지만 마지막 줄바꿈을 제어하거나 값을 명시적으로 서식화해야 한다면 printf가 더 적합합니다.

tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
greet="Hello
,
World
!"
echo "$greet" > "$output_file"
cat "$output_file"
Hello
,
World
!

큰따옴표는 단어 분리를 막으면서 변수 안의 줄바꿈을 보존합니다. echo는 마지막 줄바꿈도 추가하므로 일반 텍스트 파일에 적합합니다. 파일에 이 텍스트만 넣으려면 >를 사용하고, 기존 내용 뒤에 추가하려면 >>를 사용하세요.