Bài viết này sẽ chỉ cho bạn một số ví dụ thực tế để sử dụng printf trong Bash / Shell trên Linux.
printf lệnh xuất ra văn bản giống như echo lệnh không - nhưng nó cho phép kiểm soát nhiều hơn đối với định dạng đầu ra.
Đây là một công cụ hữu ích để tạo đầu ra văn bản được định dạng của riêng bạn - đặc biệt nếu bạn cần nhúng các biến vào văn bản, bao gồm dòng mới, căn chỉnh và định dạng văn bản và thậm chí hiển thị các giá trị đã chuyển đổi.
Cú pháp printf
Lệnh printf có cú pháp sau:
printf [-v var] format [arguments]...
Lưu ý rằng:
- -v tùy chọn yêu cầu printf lưu trữ kết quả trong biến var hơn là in nó
- định dạng là một chuỗi chứa sự kết hợp của ba giá trị khác nhau:
- Các ký tự bình thường sẽ được in nguyên văn
- Các ký tự thoát ra sau dấu gạch chéo ngược được diễn giải trước khi in
- Các chuyển đổi được chỉ định và thay thế bằng các đối số tương ứng của chúng (hãy nghĩ về chúng hơi giống với các biến)
- đối số sẽ được chuyển sang định dạng và được sử dụng trong bất kỳ chuyển đổi đã xác định nào
- Nếu có nhiều đối số hơn số chỉ định chuyển đổi trong định dạng, định dạng chuỗi được lặp lại cho đến khi tất cả đối số đã được sử dụng
- Nếu có ít đối số hơn, mã chỉ định số được đặt thành 0 và mã chỉ định chuỗi được đặt thành rỗng
printf Các ký tự, Chuyển đổi và Cờ đã Thoát
printf có một bộ sưu tập khổng lồ các tùy chọn có thể được chuyển cho nó để làm cho nó định dạng văn bản theo vô số cách. Các ví dụ dưới đây sẽ cho bạn thấy một số ứng dụng thực tế.
Thay vì liệt kê mọi có thể được chuyển cho lệnh tại đây, bạn có thể xem toàn bộ hướng dẫn sử dụng cho printf lệnh trên hệ thống của bạn bằng cách chạy:
man printf
printf Bash / Shell Ví dụ
Đúng vậy, tất cả những thứ đó thực sự tốt cho điều gì?
Hiển thị các giá trị làm tròn của các số
Đầu tiên, một tình huống đơn giản - bạn muốn định dạng một số thành hai chữ số thập phân để hiển thị:
printf "%.2f" 4.21423557
Điều này sẽ xuất ra:
4.21
Định dạng được chỉ định % .2f yêu cầu printf định dạng số thành hai chữ số thập phân. Điều này được thực hiện bằng cách sử dụng độ chính xác chỉ thị, là . (dấu chấm) ở định dạng.
Điều này sẽ làm tròn số thay vì cắt ngắn nó thành một số chữ số thập phân nhất định. Việc làm tròn số dấu phẩy động thật kỳ lạ - vì vậy hãy kiểm tra kết quả đầu ra của bạn!
Sự kỳ lạ làm tròn
Để minh họa sự kỳ lạ này, hãy xem xét những điều sau:
printf "%.2f" 4.215
Nó phải là 4,22, phải không? Sai. Trong triển khai zsh của printf , nó sẽ được làm tròn thành:
4.21
Để xác nhận rằng số is thực sự được làm tròn, chúng ta có thể kiểm tra một giá trị khác:
printf "%.2f" 4.216
Cái nào sẽ trả về:
4.22
… Vì vậy số được chuyển cho printf là được làm tròn.
Vậy tại sao giá trị được làm tròn của 4.215 dường như là sai? Nói một cách đơn giản, vì nó là một số dấu phẩy động, sự không chính xác là do sự chênh lệch giữa giá trị được hiển thị và giá trị được máy tính sử dụng trong tính toán.
Có nhiều cách giải quyết vấn đề này, nhưng nó nằm ngoài phạm vi của bài viết này - Tôi sẽ đề cập đến vấn đề khác.
Giá trị chuyển đổi (thập phân, thập lục phân, bát phân)
Một tình huống phổ biến - bạn muốn hiển thị một số số ở định dạng khác với định dạng mà chúng được cung cấp bởi một chương trình hoặc tập lệnh khác. printf có thể làm điều này bằng cách sử dụng cú pháp đặc tả chuyển đổi của nó:
printf "Decimal: %d\nHexadecimal: %x\nOctal: %o\n" 64 64 64
Điều này sẽ xuất ra:
Decimal: 64 Hexadecimal: 40 Octal: 100
Số 64 được chuyển tới bộ định dạng 3 lần và được hiển thị ở ba định dạng khác nhau.
Tạo ra kết quả tốt
Ví dụ dưới đây xuất ra một bảng được định dạng bằng printf - Tôi sẽ giải thích khi chúng ta đi vào phần nhận xét, vì vậy chúng ta có thể hiểu rõ điều gì đang xảy ra:
#/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
Chạy tập lệnh này sẽ xuất ra:
CAR BRAND COLOUR TOP SPEED ================================================== Toyota Blue 100.00 Ford Light Green 78.39 General Motors Purple 15.96
Hãy xem kỹ cách dữ liệu đã được định dạng bởi printf nơi đây. Trong trường hợp các chuỗi có độ dài ký tự nhất định được chỉ định cho tiêu đề và các hàng, văn bản sẽ căn chỉnh. Tốc độ cao nhất đã được định dạng thành hai chữ số thập phân và được đặt ở vị trí chính xác. Văn bản được căn phải ngoại trừ vị trí được chỉ định cho cột đầu tiên.
Với lượng cú pháp tương đối nhỏ, dữ liệu khó đọc đã được biến thành thông tin hữu ích.
Bầu trời là giới hạn
Bạn sẽ đưa ra lý do của riêng mình khi sử dụng printf - xây dựng giao diện dòng lệnh với các menu đẹp mắt cho các tập lệnh, lập bảng kết quả của các truy vấn cơ sở dữ liệu - đó là một công cụ mạnh mẽ cần có trong túi của bạn, đặc biệt nếu bạn muốn gây ấn tượng với ai đó bằng một tập lệnh shell trông bóng bẩy hơn là chỉ đổ văn bản chưa được định dạng vào màn hình.
Bạn có thể kết hợp printf với các lệnh xử lý văn bản khác trong Linux.