POSIX Shell: printf

쉘 스크립트를 작성할 때 단순히 메시지를 출력하기 위해 echo를 자주 사용합니다.

하지만 스크립트가 복잡해지고 여러 환경에서의 이식성(Portability)이 중요해지면 printf를 사용하는 것이 개발자 정신 건강에 좋다.

echo 대신 printf?

특징echoprintf
표준 준수시스템/쉘마다 동작이 다름 (비표준)POSIX 표준 — 어디서나 동일하게 동작
제어 능력단순 출력에 최적화포맷 지정자를 통한 세밀한 제어 가능
개행(줄바꿈)자동으로 줄을 바꿈\n을 명시해야 함 (의도적 제어 가능)
신뢰도-e, -n 옵션 등이 환경마다 다름일관된 결과 보장 (이식성 높음)

결론: 단순한 확인용 출력은 echo가 편하지만, 표(Table)를 만들거나 진법 변환, 정교한 텍스트 배치가 필요하다면 printf를 사용하는 것이 좋다.

기본 문법

printf는 포맷 문자열(Format String)을 먼저 정의하고, 그 뒤에 들어갈 인자(Arguments)를 순서대로 나열하는 문법 체계를 가지고 있다.

printf "포맷문자열" [인자1] [인자2] ...
  • 특징: 인자의 개수가 포맷 지정자보다 많으면, 포맷 문자열을 반복해서 적용합니다.
  • 주의: 자동으로 줄바꿈을 하지 않으므로 문자열 끝에 \n을 붙여야 합니다

핵심 포맷 지정자 (Format Specifiers)

인자의 데이터 타입에 맞는 지정자를 사용해야 합니다.

  • %s: String (문자열)
  • %d: Decimal (10진수 정수)
  • %f: Float (부동소수점 실수)
  • %x: Hexadecimal (16진수 소문자)
  • %o: Octal (8진수)
  • %%: % 기호 자체를 출력

고급 제어: 너비, 정렬, 정밀도

printf의 진가는 데이터를 예쁘게 정렬할 때 나타납니다.

포맷설명
%10s최소 10자 너비 확보, 오른쪽 정렬
%-10s최소 10자 너비 확보, 왼쪽 정렬
%.2f소수점 아래 2자리까지 출력
%8.2f전체 8칸 확보 후 소수점 2자리 출력

실전 예제 코드

기본 출력 및 진법 변환

# 이름과 나이 출력
printf "이름: %s, 나이: %d\n" "Kim" 30

# 10진수 255를 16진수로 변환 (결과: 0xff)
printf "16진수 변환: 0x%x\n" 255

# 퍼센트 기호 출력 (결과: 75%)
printf "CPU 사용률: %d%%\n" 75

데이터 표(Table) 만들기

#!/bin/sh

# 헤더 출력
printf "%-10s %5s %8s\n" "이름" "점수" "등급"
printf "--------------------------\n"

# 데이터 출력
printf "%-10s %5d %8s\n" "홍길동" 95 "A"
printf "%-10s %5d %8s\n" "김철수" 82 "B"
printf "%-10s %5d %8s\n" "이영희" 100 "A+"

이스케이프 시퀀스 (Escape Sequences)

문자열 내에서 특수 기능을 수행하는 기호들입니다.

  • \n: 줄바꿈 (Newline)
  • \t: 탭 (Tab)
  • \\: 백슬래시(\) 자체 출력
  • \0NNN: 8진수 숫자로 지정된 ASCII 문자 출력

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤