쉘 스크립트를 작성할 때 단순히 메시지를 출력하기 위해 echo를 자주 사용합니다.
하지만 스크립트가 복잡해지고 여러 환경에서의 이식성(Portability)이 중요해지면 printf를 사용하는 것이 개발자 정신 건강에 좋다.
echo 대신 printf?
| 특징 | echo | printf |
| 표준 준수 | 시스템/쉘마다 동작이 다름 (비표준) | 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 문자 출력




