Linux에서 Bash printf 명령을 사용하는 방법

0
553

파란색 배경에 Linux 터미널입니다.
Fatmawati achmad zaenuri/Shutterstock.com

배쉬 printf 명령을 사용하면 Linux 터미널 창에 보다 세밀한 제어와 더 많은 형식 지정 옵션을 사용할 수 있습니다. echo 명령을 제공합니다. 조차 printf 의 이상한 단점이 유용할 수 있습니다.

터미널에 쓰기

프로그램과 상호 작용하는 가장 기본적인 부분 중 하나입니다. 프로그램은 화면에 무언가를 쓰고, 당신은 그것을 읽습니다. 명령줄 프로그램의 Unix 파생 및 Linux 유지 규칙을 고려하더라도 가능한 한 간결합니다. 많은 경우 문제가 발생할 경우에만 터미널에 씁니다. 잘못된. 사용자에게 무슨 일이 일어나고 있는지, 또는 발생하려고 하거나, 방금 일어난 일을 알려주는 것은 필수적인 프로그래밍 기본 요소입니다.

Linux에서 Echo 명령을 사용하는 방법

관련된Linux에서 Echo 명령을 사용하는 방법

Bash 쉘에는 echo 터미널 창에 텍스트를 쓸 수 있는 명령입니다. 문자열에 포함된 경우 변수를 처리하고 해당 값을 표시할 수 있으며 스크립트나 명령줄에서 사용할 수 있습니다. 그래서 왜 printf 심지어 존재? 하지 않는다 echo 텍스트 쓰기 작업이 포함되어 있습니까? 잘, printf 터미널 창에 문자열을 쓰는 평범한 행위 이상의 기능을 제공합니다. 출력을 매우 유연하게 형식화할 수 있으며 다른 트릭도 있습니다.

배쉬 printf 명령은 printf C 언어의 기능이지만 차이점이 있습니다. C를 알고 있다면 이러한 차이점에 주의해야 합니다.

기본 문자열 작성

방법을 보자 echo 그리고 printf 터미널에 문자열을 쓸 때 다릅니다.

echo here are some words
printf here are some words

인용되지 않은 단어와 함께 echo 및 printf 사용

그만큼 echo 명령은 모든 단어를 인쇄하지만 printf 첫 번째 단어만 인쇄합니다. 또한 새 줄이 인쇄되지 않습니다. printf. 출력은 명령 프롬프트와 맞닿아 있습니다. 하지만 가장 먼저 해야 할 일은 printf 모든 단어에 대해 행동하려면 인용해야 합니다.

echo here are some words
printf "here are some words"

인용된 단어와 함께 echo 및 printf 사용

그게 낫다. 우리는 모든 단어를 인쇄했지만 여전히 새 줄을 얻지 못했습니다. 그 이유는 printf 한 줄을 요청하는 경우에만 새 줄을 얻습니다. 그것은 고통처럼 보일 수 있지만 하나를 포함할지 여부를 결정할 수 있습니다. 유발하다 printf 새 줄을 발행하려면 “n” 당신의 문자열에. 이것은 “개행” 이스케이프 시퀀스입니다.

echo here are some words
printf "here are some wordsn"

따옴표 붙은 단어와 줄 바꿈 문자와 함께 echo 및 printf 사용

줄 바꿈을 사용할 때도 있고 사용하지 않을 때도 있습니다. 다음은 하나의 경우입니다. printf 문은 새 줄을 사용하고 다른 문은 사용하지 않습니다.

printf "How-To " && printf "Geekn"

두 개의 printfs를 사용하여 한 줄의 텍스트 만들기

왜냐하면 첫 번째 printf 새 줄을 인쇄하지 않고 두 번째 줄의 출력 printf “How-To” 바로 뒤에 위치하며 같은 줄에 있습니다. 두번째 printf 사용한다 n 새 줄을 인쇄합니다. 이렇게 하면 인쇄된 텍스트 아래 줄에 명령 프롬프트가 나타납니다.

관련된: Linux Bash 스크립트에서 파일을 한 줄씩 처리하는 방법

기타 이스케이프 문자

사용할 수 있는 이스케이프 문자가 몇 가지 더 있습니다. 당신은 이미 “n“를 실행 중입니다.

  • N: 새 줄로 아래로 이동합니다.
  • 아르 자형: 캐리지 리턴을 인쇄합니다. 이것은 출력 커서를 현재 줄의 시작 부분으로 다시 보냅니다.
  • : 탭 문자를 인쇄합니다.
  • V: 세로 탭 공백을 인쇄합니다.
  • \: 백슬래시 문자를 인쇄합니다.
  • : 인용 문자를 인쇄합니다.
  • : 백스페이스 문자를 인쇄합니다.

캐리지 리턴 이스케이프 문자는 커서를 다시 시작 위치로 이동합니다. 현재의 선.

printf "Honey is the root of all evilrMoneyn"

캐리지 리턴 문자를 사용하여 줄의 시작 부분으로 다시 이동

그만큼 printf 명령은 왼쪽에서 오른쪽으로 입력을 처리합니다. 문자열은 다음까지 일반 텍스트로 인쇄됩니다. printf “를 만난다.r” 이스케이프 문자. 출력 커서가 현재 줄의 시작 부분으로 다시 이동합니다.

문자열 처리는 ” 바로 뒤에 있는 문자로 다시 시작됩니다.r” 캐릭터. 나머지 원인 처리 printf “Honey”라는 단어를 덮어쓰면서 “Money”를 인쇄합니다.

따옴표 “"“는 문자열을 인용하는 데 사용되며 백슬래시는 “” 문자는 이스케이프 시퀀스를 나타냅니다. 이러한 문자를 인쇄하려면 백슬래시로 이스케이프해야 합니다. 이것은 말한다 printf 리터럴 문자로 처리합니다.

printf "This is a tTab, this is a quotation mark ", and this \ is a Backslashn"

문자를 문자 그대로 처리하도록 이스케이프 처리

변수 사용

변수 사용 printf 와 함께 사용하는 것과 매우 유사합니다. echo . 이 환경 변수와 같은 변수를 포함하려면 앞에 달러 기호 “$” 평소와 같이.

printf "Home directory: $HOMEn"

환경 변수와 함께 printf 사용

관련된: Bash에서 변수로 작업하는 방법

형식 문자열

형식 문자열은 출력 형식을 정의하는 문자열입니다. 작동할 형식 문자열에 대한 인수로 텍스트 및 기타 값을 제공합니다.

형식 문자열에는 텍스트, 이스케이프 시퀀스 및 형식 지정자. 형식 지정자가 알려줍니다. printf 문자열, 정수 또는 문자와 같은 예상되는 인수 유형.

가장 일반적인 형식 지정자입니다. 그들은 모두 퍼센트 “%” 징후. 퍼센트 기호를 인쇄하려면 2개의 퍼센트 기호를 함께 사용합니다.%%.”

  • %에스: 문자열을 출력합니다.
  • %씨: 단일 문자를 인쇄합니다.
  • %디: 정수를 출력합니다.
  • %에프: 부동 소수점 숫자를 인쇄합니다.
  • %유: 부호 없는 정수를 출력합니다.
  • %영형: 8진수로 값을 인쇄합니다.
  • %엑스: 값을 16진수로 소문자로 출력합니다.
  • %엑스: 16진수로 값을 대문자로 출력합니다.
  • %이자형: 과학 표기법의 부동 소수점 숫자를 소문자로 인쇄합니다.
  • %이자형: 과학적 표기법의 부동 소수점 숫자를 대문자로 인쇄합니다.
  • %%: 퍼센트 “%” 기호를 인쇄합니다.
printf "How-To %sn" "Geek"
printf "%s%s %sn" "How" "-To" "Geek"

"너무 많은" 인수를 허용하는 printf 표시

첫 번째 명령의 형식 문자열에는 자체 텍스트가 포함되어 있습니다. “Geek” 문자열을 인수로 전달합니다. printf. “와 일치하고 다음과 같이 인쇄됩니다.%s” 형식 지정자. 형식 문자열과 인수 문자열 사이에는 공백만 있음을 유의하십시오. C에서는 이들을 구분하기 위해 쉼표가 필요하지만 Bash 버전에서는 printf 공간을 사용하는 것으로 충분합니다.

두 번째 형식 문자열에는 형식 지정자와 개행 이스케이프 시퀀스만 포함됩니다. 세 개의 문자열 인수는 “%s” 형식 지정자를 차례로 지정합니다. 다시 말하지만 C에서는 각 인수 사이에 쉼표를 넣어야 하지만 Bash는 printf 우리가 그것에 대해 잊어 보자.

다른 유형의 인수를 인쇄하려면 적절한 형식 지정자를 사용하기만 하면 됩니다. 다음은 다음을 사용하여 작성된 빠른 숫자 변환 루틴입니다. printf. 값 15를 10진수, 8진수, 16진수 표기법으로 인쇄합니다.

printf "Dec: %dnOct: %onHex: %xn" 15 15 15

printf를 사용하여 다른 기본 표기법으로 숫자 값 인쇄

예제가 덜 복잡해지도록 다시 약간 다듬어 보겠습니다.

printf "Hex: %xn" 15

16진수 값 인쇄

우리 대부분은 16진수 값을 대문자로 보고 0x10보다 작은 값을 앞에 0으로 인쇄하는 데 익숙합니다. 대문자 16진수 형식 지정자를 사용하여 이를 달성할 수 있습니다.%X” 그리고 퍼센트 기호 사이에 너비 지정자를 넣습니다 “%” 그리고 “X” 캐릭터.

이것은 말한다 printf 인수가 인쇄되어야 하는 필드의 너비입니다. 필드는 공백으로 채워집니다. 이 형식을 사용하면 패딩 없이 두 자리 값이 인쇄됩니다.

printf "Hex: %2Xn" 15

2자 너비 필드에 대문자로 16진수 값 인쇄

이제 선행 공백이 인쇄된 대문자 값을 얻습니다. 우리는 만들 수 있습니다 printf 두 필드 앞에 0을 넣어 공백 대신 0으로 필드를 채웁니다.

printf "Hex: %02Xn" 15

0으로 채워진 2자 너비 필드에 대문자로 16진수 값 인쇄

정밀도 지정자를 사용하면 출력에 포함할 소수점 수를 설정할 수 있습니다.

printf "Floating point: %08.3fn" 9.243546

부동 소수점 숫자와 함께 너비 및 정밀도 수정자 사용

이렇게 하면 깔끔하게 정렬된 출력으로 결과 테이블을 쉽게 생성할 수 있습니다. 이 다음 명령은 Bash의 또 다른 단점도 보여줍니다. printf. 형식 지정자보다 더 많은 인수가 있는 경우 모든 인수가 사용될 때까지 인수가 일괄적으로 형식 문자열에 공급됩니다. 한 번에 처리되는 일괄 처리의 크기는 형식 문자열에 있는 형식 지정자의 수입니다. C에서 추가 인수 printf 함수 호출은 무시됩니다.

printf "Float: %8.3fn" 9.243546 23.665 8.0021

너비 및 정밀도 수정자를 사용하여 깔끔한 테이블 만들기

너비 및 정밀도 지정자를 문자열과 함께 사용할 수도 있습니다. 이 명령은 10자 너비의 필드에 문자열을 인쇄합니다.

printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3

문자열과 함께 너비 수정자 사용

기본적으로 값은 해당 필드에서 오른쪽 정렬됩니다. 왼쪽 정렬하려면 빼기 기호 “-” 퍼센트 바로 뒤에 “%” 징후.

printf "%-10s %d" "coats" 7 "shoes" 22 "Umbrellas" 3

문자열과 함께 왼쪽 맞춤 너비 지정자 사용

정밀도 지정자는 인쇄되는 최대 문자 수를 설정하는 데 사용할 수 있습니다. 콜론 문자를 사용하고 있습니다.:” 너비 필드의 한계를 표시합니다. “Umbrellas”라는 단어가 잘린 방식이 아닙니다.

printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "coats" "shoes" "Umbrellas"

정밀도 수정자를 사용하여 문자열에서 인쇄되는 문자 수 제한

너비 지정자는 다음으로 전달할 수도 있습니다. 논쟁. 별표 사용”*“를 숫자 지정자 대신 사용하고 너비를 정수 인수로 전달합니다.

printf "%*sn" 20 "Rightmost" 12 "Middle" 5 "leftmost"

너비 지정자를 printf에 인수로 전달

기타 트릭과 단점

형식 문자열 내의 형식 지정자는 명령줄에서 일반 인수로 제공되거나 출력으로 생성되는지 여부에 관계없이 적절한 유형의 값으로 작동합니다. 표현.

이것은 두 숫자의 합을 출력합니다:

printf "23+32=%dn" $((23+32))

두 숫자의 합 출력하기

이 명령은 현재 작업 디렉토리의 디렉토리 수를 인쇄합니다.

printf "There are %d directoriesn" $(ls -d */ | wc -l)

printf로 디렉토리 계산하기

printf 명령은 다른 명령에 대한 호출에서 반환된 문자열을 인쇄합니다.

printf "Current user: %sn" $(whoami)

다른 명령의 출력 인쇄

문자열 형식 지정자가 “%s“는 인수와 함께 제공되지 않습니다. printf 아무것도 인쇄하지 않습니다.

printf "One: %s two: %sn" "Alpha"

printf가 누락된 문자열 인수를 처리하는 방법

문자열 형식 지정자가 “%s”는 실수로 수치를 부여받아 마치 문자열인 것처럼 출력하고 불평하지 않는다. C로 이것을 시도하지 마십시오 printf– 아주 나쁜 일이 일어날 것입니다. 프로그램이 충돌할 수 있습니다. 하지만 배쉬 printf 불평하지 않고 처리합니다.

printf "One: %s two: %sn" "Alpha" 777

printf가 자동으로 정수를 문자열 값으로 받아들이는 방법

정수 형식 지정자가 “%d“는 인수를 받지 않고 0을 출력합니다.

printf "Integer: %dn"

printf가 누락된 정수 인수를 처리하는 방법

정수 형식 지정자가 “%d“가 실수로 문자열 인수를 받으면 Bash는 오류 메시지를 출력하고 printf 0을 인쇄합니다.

printf "Integer: %dn" "Seven"

printf가 정수 인수 대신 제공된 문자열을 처리하는 방법

유니코드 번호 또는 “코드 포인트”를 사용하여 어색한 기호를 생성할 수 있습니다. 문자 “u” 다음에 유니코드 값을 사용하여 이스케이프됩니다.

printf "The Euro symbol: u20ACn"

이스케이프된 유니코드 값 인쇄

이스케이프 시퀀스를 포함하려면 논쟁 “를 사용해야 합니다.%b” 형식 지정자가 아니라 “%s” 문자열 형식 지정자.

printf "%s" "u20ACn"
printf "%b" "u20ACn"

%b 형식 지정자를 사용하여 문자열 인수의 이스케이프 시퀀스 처리

첫번째 printf 문은 유니코드 값을 처리하지 않으며 개행 이스케이프 시퀀스를 인식하지 못합니다. 두번째 printf 문은 “를 사용합니다.%b” 형식 지정자. 이렇게 하면 유니코드 문자가 올바르게 처리되고 새 줄이 인쇄됩니다.

관련된: ANSI 및 유니코드와 같은 문자 인코딩이란 무엇이며 어떻게 다릅니까?

코스용 말

때때로 당신이 해야 할 일은 echo 터미널 창에 일부 텍스트. 하지만 위치 지정 및 서식 지정을 적용해야 하는 경우 printf 작업에 적합한 도구입니다.

printf "%b" "Tha-" "tha-" "tha-" "that's all folks.n"