English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Shell printf 명령어

이전 장에서 Shell의 echo 명령어를 배웠습니다. 이 장에서는 Shell의 또 다른 출력 명령어인 printf를 배우겠습니다.

printf 명령어는 C 프로그램 라이브러리(library)의 printf() 프로그램을 모방합니다.

printf는 POSIX 표준에 정의되어 있으므로, printf를 사용하는 스크립트는 echo를 사용하는 스크립트보다 이식성이 좋습니다.

printf는 인용 텍스트나 공백으로 구분된 매개변수를 사용하며, 외부에서 printf에서 포맷 문자열을 사용할 수 있으며, 문자열의 너비, 좌우 정렬 방식 등을 설정할 수 있습니다. 기본적으로 printf는 echo와 같이 자동으로 줄 바꿈 문자를 추가하지 않으므로, 우리는 수동으로 \n을 추가할 수 있습니다.

printf 명령어의 문법:

printf format-string [arguments...]

매개변수 설명:

  • format-string: 으로 형식 제어 문자입니다

  • arguments: 으로 매개변수 목록입니다.

$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell\n"
Hello, Shell
$

그래서, 저는 printf의 강력한 기능을 보여주기 위해 스크립트를 사용하겠습니다:

#!/bin/bash
# author:기본教程网
# url:ko.oldtoolbag.com
 
printf "%%-10s %%-8s %%-4s\n" 이름 성별 체중kg  
printf "%%-10s %%-8s %%-4.2f\n" 구정 남 66.1234 
printf "%%-10s %%-8s %%-4.2f\n" 양과 남 48.6543 
printf "%%-10s %%-8s %%-4.2f\n" 구푸 여 47.9876

실행 스크립트, 결과를 다음과 같이 출력합니다:

이름          성별          체중kg
구정          남      66.12
양과          남      48.65
구푸          여      47.99

%s %c %d %f 모두 포맷 대체 기호입니다%s 한 문자열을 출력하며,%d 정수형 출력하며,%c 한 문자를 출력하며,%f 실수를 출력하며, 소수점 형식으로 출력합니다.

%-10s는 너비가 10 자리수- 표시되면 왼쪽 정렬되고, 없으면 오른쪽 정렬되며, 모든 문자가 10 자리수의 문자 내에 있으면, 부족하면 자동으로 공백으로 채우고, 초과하면 모든 내용을 표시합니다.

%-4.2f는 소수점으로 포맷화하며, .2 지정2위소수점.

#!/bin/bash
# author:기본教程网
# url:ko.oldtoolbag.com
 
# format-string이 이중옆괄호입니다
printf "%d %s\n" 1 "abc"
# 단옆괄호와 이중옆괄호는 같은 효과를 가집니다 
printf '%d %s\n' 1 "abc" 
# 따옴표 없이도 출력할 수 있습니다
printf %s abcdef
# 형식에 단일 매개변수가 지정되었지만, 추가 매개변수는 여전히 해당 형식으로 출력됩니다, format-string이 재사용됩니다
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 인자가 없으면 %s를 NULL로 대체하고, %d를 0으로 대체합니다
printf "%s and %d \n"

실행 스크립트, 결과를 다음과 같이 출력합니다:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

printf의 escape 시퀀스

시퀀스설명
\a경고 문자, 일반적으로 ASCII의 BEL 문자
\b뒤로 가기
\c출력 결과의 끝에 있는 모든 줄 바꿈 문자를 억제(표시하지 않음)(%b 형식 지시자에 의해 제어된 매개변수 문자열에서만 유효), 그리고 매개변수에 남아 있는 모든 문자, 그리고 다음 매개변수, 그리고 포맷 문자열에 남아 있는 모든 문자는 무시됨
\f페이지(formfeed)
\n줄 바꿈
\r카리지 리턴(Carriage return)
\t수평 테이블 스페이스
\v수직 테이블 스페이스
\\문자面上的 반대쪽 슬래시 문자
\ddd표시1부터3자리수 8진수 값의 문자. 포맷 문자열에서만 유효
\0ddd표시1부터3의 8진수 값 문자
$ printf "a 문자열, 처리 없음:<%s>\n" "A\nB"
a 문자열, 처리 없음:<A\nB>
$ printf "a 문자열, 처리 없음:<%b>\n" "A\nB"
a 문자열, 처리 없음:<A
B>
$ printf "ko.oldtoolbag.com \a"
ko.oldtoolbag.com $                  #없는 줄 바꿈