Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash/Shell에서 printf 명령 사용하기(예제 포함)

이 도움말에서는 printf 사용에 대한 몇 가지 실용적인 예를 보여줍니다. Linux의 Bash/Shell에서 명령을 실행합니다.

printf 명령은 echo와 매우 유사한 텍스트를 출력합니다. 명령은 수행하지만 출력 형식을 더 많이 제어할 수 있습니다.

특히 텍스트에 변수를 포함하고, 줄 바꿈을 포함하고, 텍스트를 정렬 및 서식 지정하고, 변환된 값을 표시해야 하는 경우 서식이 지정된 텍스트 출력을 생성하는 데 유용한 도구입니다.

printf 구문

printf 명령의 구문은 다음과 같습니다.

printf [-v var] format [arguments]...

참고:

  • -v 옵션은 결과를 변수 var에 저장하도록 printf에 지시합니다. 인쇄하는 것보다
  • 형식 세 가지 다른 값의 조합을 포함하는 문자열입니다.
    • 문자 그대로 인쇄되는 일반 문자
    • 인쇄 전에 해석되는 백슬래시 이스케이프 문자
    • 지정되고 해당 인수로 대체되는 변환(변수와 유사하다고 생각하면 됨)
  • 인수 형식으로 전달됩니다. 정의된 모든 변환에 사용됨
    • 변환 지정자보다 많은 인수가 형식에 있는 경우 형식 모든 인수까지 문자열이 반복됩니다. 사용되었습니다
    • 인수가 더 적은 경우 숫자 지정자는 0으로 설정되고 문자열 지정자는 null로 설정됩니다.

printf 이스케이프된 문자, 변환 및 플래그

인쇄 무수히 많은 방법으로 텍스트 형식을 지정하기 위해 전달할 수 있는 엄청난 옵션 모음이 있습니다. 아래의 예는 몇 가지 실용적인 응용 프로그램을 보여줍니다.

모든을 나열하는 대신 여기에서 명령에 전달할 수 있는 옵션이 있으면 printf의 전체 사용자 설명서를 볼 수 있습니다. 다음을 실행하여 시스템에서 명령:

man printf

printf Bash/Shell 예제

그렇죠. 그럼 이 모든 것이 실제로 좋은 점은 무엇입니까?

반올림된 숫자 값 표시

첫째, 간단한 시나리오 - 표시할 소수점 이하 두 자리로 숫자 형식을 지정하려는 경우:

printf "%.2f" 4.21423557

다음과 같이 출력됩니다.

4.21

지정된 형식 %.2f 숫자를 소수점 이하 두 자리로 형식화하도록 printf에 지시합니다. 이는 정밀도를 사용하여 수행됩니다. 지시문은 입니다. (마침표) 형식.

이렇게 하면 숫자가 지정된 소수점 이하 자릿수로 잘리지 않고 반올림됩니다. 부동 소수점 숫자의 반올림이 이상하므로 출력을 확인하십시오!

이상한 반올림

이 이상함을 설명하기 위해 다음을 고려하십시오.

printf "%.2f" 4.215

4.22로 해야겠죠? 잘못된. printf의 zsh 구현에서 , 다음과 같이 반올림됩니다.

4.21

번호가 인지인지 확인하려면 실제로 반올림되면 다른 값을 확인할 수 있습니다.

printf "%.2f" 4.216

반환할 항목:

4.22

... 그래서 숫자가 printf에 전달됩니다. 이다 반올림됩니다.

그래서 반올림된 값이 4.215인 이유는 잘못된 것 같습니까? 간단히 말해 부동 소수점 숫자이므로 부정확성은 표시된 값과 컴퓨터가 계산에 사용하는 값 ​​사이의 불일치로 인해 발생합니다.

이 문제를 해결할 수 있는 방법이 있지만 이 기사의 범위를 벗어납니다. 다른 기사에서 다루겠습니다.

값 변환(10진수, 16진수, 8진수)

일반적인 시나리오 - 다른 프로그램이나 스크립트에서 제공한 것과 다른 형식으로 일부 숫자를 표시하려고 합니다. printf 변환 사양 구문을 사용하여 이 작업을 수행할 수 있습니다.

printf "Decimal: %d\nHexadecimal: %x\nOctal: %o\n" 64 64 64

다음과 같이 출력됩니다.

Decimal: 64
Hexadecimal: 40
Octal: 100

숫자 64 포맷터에 3번 전달되고 3가지 다른 형식으로 표시됩니다.

멋진 결과물 만들기

아래 예는 printf를 사용하여 형식이 지정된 표를 출력합니다. – 댓글을 통해 설명하겠습니다. 그래서 무슨 일이 일어나고 있는지 명확하게 알 수 있습니다.

#/bin/bash

# Define the format for the header text
# This is a new line (\n) followed by a left-aligned string of 15 characters (%-15s), followed by a string of 15 characters (%15s), finally followed by a string of 10 characters (%10s) and another newline
header_format="\n %-15s %15s %10s\n"

# Define the format for the data in each row
# The first two entries mirror those in the header, but the final one is a bit different - a floating number with 2 decimal places(%11.2f) 
row_format=" %-15s %15s %11.2f\n"

# Use the printf command to print the header
# The format is specified, and the arguments containing the column names for the table are supplied
# printf will take the header_format, and insert the values from the attributes into it, formatted to the given specification, then print it
printf "$header_format" "CAR BRAND" "COLOUR" "TOP SPEED"

# Print the horizontal line under the table header
# Here, printf is used to print an equals symbol.  Brace expansion (the curly braces) is a shell scripting shortcut which will run the printf command for every number between 1 and 50, repeating the symbol 50 times to create a line
printf '=%.0s' {1..50}

# Print each row of data using the row_format.  Each line (indicated by a backslash and a line return) contains three values - the car brand, colour, and top speed
# Any value with a space needs to be quoted as values are separated by spaces and printf won't be able to tell where one value ends and another begins
printf "$row_format" \
Toyota Blue 100 \
Ford "Light Green" 78.3875 \
"General Motors" Purple 15.96

이 스크립트를 실행하면 다음이 출력됩니다.

CAR BRAND                COLOUR  TOP SPEED
==================================================
Toyota                     Blue      100.00
Ford                Light Green       78.39
General Motors           Purple       15.96

printf에 의해 데이터 형식이 어떻게 지정되었는지 주의 깊게 살펴보세요. 여기. 헤더 및 행에 대해 특정 문자 길이의 문자열이 지정된 경우 텍스트가 정렬됩니다. 최고 속도는 소수점 이하 두 자리까지 형식화되어 올바른 위치에 배치되었습니다. 텍스트는 첫 번째 열에 지정된 경우를 제외하고 오른쪽 정렬됩니다.

비교적 적은 양의 구문으로 읽기 어려운 데이터를 유용한 정보로 전환했습니다.

하늘의 한계

printf를 사용하는 이유를 스스로 생각해 볼 수 있습니다. – 스크립트용 예쁜 메뉴로 명령줄 인터페이스 구축, 데이터베이스 쿼리 결과 표 작성 – 특히 형식이 지정되지 않은 텍스트를 그냥 버리는 것보다 매끄러운 모양의 셸 스크립트로 누군가에게 깊은 인상을 남기고 싶은 경우 가방에 넣어두면 좋은 강력한 도구입니다. 화면입니다.

printf를 결합할 수 있습니다. Linux의 다른 텍스트 처리 명령과 함께 사용할 수 있습니다.