Lệnh printf trong bash

Thông thường, khi viết tập lệnh bash, chúng ta sử dụng echo để in ra đầu ra tiêu chuẩn. echo là một lệnh đơn giản nhưng bị hạn chế về khả năng của nó.
Để có nhiều quyền kiểm soát hơn đối với định dạng của đầu ra, hãy sử dụng lệnh printf.

Các printf định dạng lệnh và in đối số của nó, tương tự như hàm printf() trong C.

Câu lệnh printf

printf là một câu lệnh có sẵn shell trong Bash và trong các shell phổ biến khác như Zsh và Ksh. Ngoài ra còn có một tệp nhị phân độc lập /usr/bin/printf , nhưng phiên bản tích hợp sẵn của shell sẽ được ưu tiên hơn. Chúng ta sẽ đề cập đến phiên bản có sẵn printf của bash.

Cú pháp của printf như sau:

printf [-v var] format [arguments]

Tùy chọn -v bảo printf không để in ra nhưng để gán nó vào biến.

Chuỗi format là một chuỗi có thể chứa ba loại đối tượng khác nhau:

  • Các ký tự bình thường được in đơn giản ở đầu ra nguyên trạng.
  • Các ký tự thoát ra sau dấu gạch chéo ngược được giải thích và sau đó được in.
  • Thông số kỹ thuật chuyển đổi mô tả định dạng và được thay thế bằng giá trị của các đối số tương ứng tuân theo chuỗi định dạng.

Lệnh chấp nhận bất kỳ số lượng arguments. Nếu arguments cung cấp nhiều hơn chỉ định định dạng, format chuỗi sẽ được sử dụng lại để sử dụng tất cả các đối số. Nếu arguments cung cấp ít hơn mã định dạng, các mã định dạng số bổ sung được đặt thành giá trị 0 trong khi mã định dạng chuỗi được đặt thành chuỗi rỗng.

Dưới đây là một số điểm cần xem xét khi chuyển các đối số của lệnh printf:

  • Trình sehll sẽ thay thế tất cả các biến, đối sánh ký tự đại diện và các ký tự đặc biệt trước khi chuyển các đối số cho lệnh printf.
  • Khi sử dụng các dấu ngoặc kép '', giá trị chữ của mỗi ký tự trong dấu ngoặc kép sẽ được giữ nguyên. Các biến và lệnh sẽ không được mở rộng.

Một ví dụ điển hình của việc sử dụng printf trông giống như:

printf "Open issues: %s\nClosed issues: %s\n" "34" "65"

Output:

Open issues: 34
Closed issues: 65

Chuỗi Open issues: %s\nClosed issues: %s\n là format trong khi “34” và “65” là các đối số. Chuỗi định dạng chứa hai ký tự dòng mới ( \n ) và hai ký tự định dạng ( %s ) được thay thế bằng các đối số.

Lệnh printf không thêm một ký tự xuống dòng ( \n ) vào cuối dòng.

Các ký tự thoát khỏi dấu gạch chéo ngược

Các ký tự thoát sau dấu gạch chéo ngược được diễn giải khi được sử dụng trong chuỗi định dạng hoặc trong một đối số tương ứng với mã %b định nghĩa chuyển đổi. Dưới đây là danh sách các ký tự thoát phổ biến nhất:

  • \\ – Hiển thị một ký tự gạch chéo ngược.
  • \b – Hiển thị một ký tự xóa lùi.
  • \n – Hiển thị một dòng mới.
  • \r – Hiển thị dấu xuống dòng.
  • \t – Hiển thị một tab ngang.
  • \v – Hiển thị một tab dọc.

Thông số kỹ thuật chuyển đổi

Đặc tả chuyển đổi có dạng sau:

%[flags][width][.precision]specifier

Mỗi ngôi sao đặc điểm kỹ thuật chuyển đổi với ký hiệu phần trăm ( % ), bao gồm bổ tùy chọn và kết thúc với một trong các chữ cái sau đó đại diện cho kiểu dữ liệu ( specifier) của đối số tương ứng: aAbcdeEfgGioqsuxX.

Loại thông số chuyển đổi

Chuyển đổi kiểu specifier là một ký tự chỉ định cách diễn giải đối số tương ứng. Ký tự này là bắt buộc và nó được đặt sau các trường tùy chọn.

Dưới đây là danh sách hiển thị tất cả các chuyển đổi loại và những gì chúng thực hiện:

  • %b – In đối số trong khi mở rộng chuỗi thoát dấu gạch chéo ngược.
  • %q – In đối số được trích dẫn, có thể sử dụng lại làm đầu vào.
  • %d%i– In lập luận như một số nguyên thập phân có chữ ký.
  • %u – In đối số dưới dạng số nguyên thập phân không dấu.
  • %o – In đối số dưới dạng số nguyên bát phân không dấu.
  • %x%X– In đối số dưới dạng số nguyên thập lục phân không dấu. %x in chữ thường và %X in chữ hoa.
  • %e%E– In đối số dưới dạng số dấu phẩy động trong ký hiệu hàm mũ. %e in chữ thường và %E in chữ hoa.
  • %a%A– In đối số dưới dạng số dấu phẩy động dưới dạng ký hiệu phân số thập lục phân. %a in chữ thường và %A in chữ hoa.
  • %g%G– In đối số dưới dạng số dấu phẩy động theo ký hiệu bình thường hoặc hàm mũ, tùy theo giá trị nào phù hợp hơn với giá trị và độ chính xác đã cho. %g in chữ thường và %G in chữ hoa.
  • %c – In đối số dưới dạng một ký tự duy nhất.
  • %f – In đối số dưới dạng số dấu phẩy động.
  • %s – In đối số dưới dạng chuỗi.
  • %%– In một ký % hiệu chữ .

Một số không có dấu đại diện cho số 0 và số dương, trong khi một số có dấu đại diện cho số âm, số 0 và số dương.

Lệnh sau in số 100 trong ba hệ thống số khác nhau:

printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100

Output:

Decimal: 100
Hex: 64
Octal: 144

Chỉ thị Flag

Flag là công cụ sửa đổi tùy chọn đầu tiên và được sử dụng để đặt phần bổ sung, số không ở đầu, tiền tố, v.v.

Dưới đây là những cái phổ biến nhất:

  • -– Căn trái văn bản đã in trong trường. Theo mặc định, văn bản được căn phải.
  • +– Đặt tiền tố các số bằng dấu +hoặc -. Theo mặc định, chỉ các số âm mới được bắt đầu bằng dấu âm.
  • 0 – Dán các số có số 0 ở đầu thay vì khoảng trắng.
  • trống – Đặt tiền tố các số dương với một khoảng trống và các số âm với một dấu trừ ( -).
  • #– Một định dạng thay thế cho số.

Chỉ thị Width

Lệnh được width gửi được đặt sau bất kỳ ký tự cờ nào và chỉ định số ký tự tối thiểu mà chuyển đổi sẽ dẫn đến.

Nếu chiều rộng văn bản đầu ra nhỏ hơn chiều rộng được chỉ định, thì nó sẽ được đệm bằng khoảng trắng. Chiều rộng có thể được chỉ định dưới dạng số nguyên thập phân không âm hoặc dấu hoa thị ( *).

Đây là một ví dụ:

printf "%20s %d\n" Mark 305

%20s có nghĩa là đặt trường dài ít nhất 20 ký tự. Khoảng trống được thêm vào trước văn bản vì theo mặc định, đầu ra là căn phải. Để căn chỉnh văn bản sang trái, hãy sử dụng -%-20s).

Mark 305

Khi dấu hoa thị ( *) được sử dụng làm chỉ thị width, thì độ rộng của trường chuyển đổi được đặt bởi đối số độ rộng đứng trước đối số đang được định dạng.

Trong ví dụ dưới đây, chúng ta đang đặt chiều rộng thành 10:

printf "%0*d" 10 5

0 là một cờ có đệm số bằng các số 0 ở đầu thay vì khoảng trống. Văn bản đầu ra sẽ có ít nhất 10 ký tự:

0000000005

Chỉ thị Precision

Công cụ .precision sửa đổi bao gồm một dấu chấm ( .) theo sau là một số nguyên dương hoặc dấu hoa thị ( *) tùy thuộc vào loại công cụ sửa đổi, đặt số ký tự chuỗi hoặc chữ số hoặc số vị trí thập phân được in.

Độ chính xác có tác dụng sau:

  • Nếu kiểu chuyển đổi là số nguyên, độ chính xác chỉ định số chữ số tối thiểu được in. Nếu số chữ số trong đối số nhỏ hơn độ chính xác, các số không ở đầu sẽ được in.
  • Nếu kiểu chuyển đổi là dấu phẩy động, thì độ chính xác chỉ định số chữ số theo sau ký tự dấu phẩy. Độ chính xác mặc định là 6.
  • Nếu loại chuyển đổi là một chuỗi, độ chính xác chỉ định số ký tự tối đa được in. Nếu số ký tự trong đối số lớn hơn độ chính xác, các ký tự thừa sẽ bị cắt bớt.

Dưới đây là một ví dụ cho thấy cách làm tròn một số dấu phẩy động thành 3 số thập phân:

printf "%.3f" 1.61803398

Output:

1.618

Khi độ chính xác được đặt thành dấu hoa thị ( * ), giá trị của nó được đặt bởi đối số chính xác đứng trước đối số đang được định dạng.

printf "%.*f" 3 1.61803398

Output:

1.618

Phần kết luận

Lệnh printf in một văn bản định dạng theo định dạng và tham số có sẵn.

Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng để lại bình luận.

0

0

votes

Article Rating

Share this:

Like this:

Like

Loading…