Cú đánh printf
lệnh cho phép bạn ghi vào cửa sổ đầu cuối Linux với khả năng kiểm soát tốt hơn và nhiều tùy chọn định dạng hơn echo
lệnh cung cấp. Thậm chí printf
Những điều kỳ quặc có thể hữu ích.
Ghi vào một thiết bị đầu cuối
Đây là một trong những phần cơ bản nhất của việc tương tác với một chương trình. Chương trình ghi một cái gì đó lên màn hình và bạn đọc nó. Ngay cả khi xem xét quy ước về các chương trình dòng lệnh có nguồn gốc từ Unix và được Linux ủng hộ càng ngắn càng tốt — nhiều người chỉ ghi vào thiết bị đầu cuối nếu có vấn đề gì xảy ra Sai lầm. Nói cho người dùng biết điều gì đang xảy ra, hoặc sắp xảy ra, hoặc vừa mới xảy ra là một nguyên tắc lập trình thiết yếu.
Bash shell có echo
lệnh có thể ghi văn bản vào cửa sổ đầu cuối. Nó có thể xử lý các biến và hiển thị giá trị của chúng nếu chúng được bao gồm trong chuỗi và bạn có thể sử dụng nó trong các tập lệnh hoặc trên dòng lệnh. Vậy tại sao printf
ngay cả khi tôn tại? Không echo
có bao gồm việc viết văn bản không? Tốt, printf
cung cấp chức năng ngoài hành động đơn giản là ghi chuỗi vào cửa sổ đầu cuối. Nó cho phép bạn định dạng đầu ra với tính linh hoạt cao và nó cũng có các thủ thuật khác.
Cú đánh printf
lệnh được mô phỏng trên printf
chức năng từ ngôn ngữ C, nhưng có sự khác biệt. Nếu bạn biết C, bạn sẽ cần phải để ý những điểm khác biệt đó.
Viết chuỗi cơ bản
Hãy xem làm thế nào echo
và printf
khác nhau khi họ ghi chuỗi vào thiết bị đầu cuối.
echo here are some words
printf here are some words
Các echo
lệnh in tất cả các từ nhưng printf
chỉ in từ đầu tiên. Ngoài ra, không có dòng mới được in bởi printf
. Kết quả đầu ra được đặt ngay trên dấu nhắc lệnh. Nhưng, điều đầu tiên, phải có printf
hành động trên tất cả các từ, chúng cần được trích dẫn.
echo here are some words
printf "here are some words"
Cái đó tốt hơn. Chúng tôi đã in tất cả các từ nhưng chúng tôi vẫn không nhận được dòng mới. Đó là bởi vì với printf
bạn chỉ nhận được một dòng mới nếu bạn yêu cầu một dòng. Điều đó có vẻ như là một nỗi đau nhưng nó cho phép bạn quyết định có nên bao gồm một hay không. Gây ra printf
để phát hành một dòng mới, bạn cần bao gồm “n
”Trong chuỗi của bạn. Đây là trình tự thoát “dòng mới”.
echo here are some words
printf "here are some wordsn"
Đôi khi bạn sẽ sử dụng một dòng mới và đôi khi bạn không. Đây là một trường hợp mà một printf
câu lệnh sử dụng một dòng mới và câu lệnh kia thì không.
printf "How-To " && printf "Geekn"
Bởi vì người đầu tiên printf
không in một dòng mới, đầu ra từ dòng thứ hai printf
được đặt ngay sau “Hướng dẫn” và trên cùng một dòng. Thư hai printf
có sử dụng n
để in một dòng mới. Điều này làm cho dấu nhắc lệnh xuất hiện trên dòng bên dưới văn bản được in.
Các nhân vật thoát khác
Dưới đây là một số ký tự thoát khác mà bạn có thể sử dụng. Bạn đã thấy “n
”Đang hoạt động.
- N: Chuyển xuống một dòng mới.
- r: In dấu xuống dòng. Điều này sẽ gửi con trỏ đầu ra trở lại đầu dòng hiện tại.
- t: In một ký tự tab.
- v: in ra một không gian tab dọc.
- \: In một ký tự gạch chéo ngược.
- ”: In một ký tự trích dẫn.
- b: In ký tự xóa lùi.
Ký tự thoát ký tự xuống dòng di chuyển con trỏ trở lại đầu hiện hành hàng.
printf "Honey is the root of all evilrMoneyn"
Các printf
lệnh xử lý đầu vào của nó từ trái sang phải. Chuỗi được in dưới dạng văn bản bình thường cho đến khi printf
gặp phải “r
”Nhân vật thoát. Con trỏ đầu ra được chuyển trở lại đầu dòng hiện tại.
Quá trình xử lý chuỗi tiếp tục với ký tự ngay sau dấu “r
” tính cách. Xử lý các nguyên nhân còn lại printf
để in “Tiền”, ghi đè từ “Em yêu”.
Dấu ngoặc kép “"
“Được sử dụng để trích dẫn chuỗi và dấu gạch chéo ngược””Ký tự biểu thị các chuỗi thoát. Nếu bạn muốn in những ký tự này, bạn cần phải loại bỏ chúng bằng dấu gạch chéo ngược. Điều này nói với
printf
để coi chúng như các ký tự chữ.
printf "This is a tTab, this is a quotation mark ", and this \ is a Backslashn"
Sử dụng các biến
Sử dụng các biến với printf
rất giống với việc sử dụng chúng với echo
. Để bao gồm một biến, như biến môi trường này, hãy đặt trước nó bằng ký hiệu đô la “$
” như thường lệ.
printf "Home directory: $HOMEn"
Định dạng chuỗi
Chuỗi định dạng là chuỗi xác định định dạng của đầu ra. Bạn cung cấp văn bản và các giá trị khác làm đối số để chuỗi định dạng hoạt động.
Chuỗi định dạng có thể bao gồm văn bản, chuỗi thoát và định dạng chỉ định. Định dạng chỉ định cho biết printf
loại đối số mong đợi, chẳng hạn như chuỗi, số nguyên hoặc ký tự.
Đây là những chỉ định định dạng phổ biến nhất. Tất cả chúng đều được bắt đầu bằng một phần trăm “%
” dấu hiệu. Để in dấu phần trăm, bạn sử dụng hai dấu phần trăm với nhau “%%
. ”
- %S: In một chuỗi.
- %c: In một ký tự.
- % d: In một số nguyên.
- % f: in một số dấu phẩy động.
- % u: In một số nguyên không dấu.
- % o: In một giá trị dưới dạng bát phân.
- % x: In một giá trị ở dạng thập lục phân, ở dạng chữ thường.
- % X: In một giá trị ở dạng thập lục phân, ở dạng chữ hoa.
- % e: In một số dấu phẩy động dưới dạng ký hiệu khoa học, ở dạng chữ thường.
- % E: In một số dấu phẩy động trong ký hiệu khoa học, ở dạng chữ hoa.
- %%: In biểu tượng phần trăm “%”.
printf "How-To %sn" "Geek"
printf "%s%s %sn" "How" "-To" "Geek"
Chuỗi định dạng trong lệnh đầu tiên bao gồm một số văn bản của riêng nó. Chúng tôi chuyển chuỗi “Geek” làm đối số cho printf
. Nó được so khớp với và được in bởi “%s
Định dạng ”. Lưu ý rằng chỉ có một khoảng cách giữa chuỗi định dạng và chuỗi đối số. Trong C, bạn cần dấu phẩy để phân tách chúng nhưng với phiên bản Bash của printf
sử dụng một không gian là đủ.
Chuỗi định dạng thứ hai chỉ chứa các mã định dạng và chuỗi thoát dòng mới. Ba đối số chuỗi được sử dụng bởi mỗi “%s
Lần lượt các chỉ định định dạng ”. Một lần nữa, trong C, bạn cần đặt dấu phẩy giữa mỗi đối số nhưng dấu Bash printf
chúng ta hãy quên điều đó đi.
Để in các loại đối số khác nhau, bạn chỉ cần sử dụng công cụ định dạng thích hợp. Đây là một quy trình chuyển đổi số nhanh được xây dựng bằng cách sử dụng printf
. Chúng tôi sẽ in giá trị 15 dưới dạng ký hiệu thập phân, bát phân và thập lục phân.
printf "Dec: %dnOct: %onHex: %xn" 15 15 15
Hãy cắt nó lại một chút để ví dụ bớt lộn xộn hơn.
printf "Hex: %xn" 15
Hầu hết chúng ta đã quen với việc nhìn thấy các giá trị thập lục phân ở dạng chữ hoa và với các giá trị nhỏ hơn 0x10 được in với số 0 ở đầu. Chúng tôi có thể đạt được điều đó bằng cách sử dụng công cụ định dạng thập lục phân viết hoa “%X
”Và đặt một chỉ định độ rộng giữa dấu phần trăm“%
” và “X
” tính cách.
Điều này nói với printf
chiều rộng của trường mà đối số sẽ được in. Trường này được đệm bằng khoảng trắng. Với định dạng này, các giá trị có hai chữ số sẽ được in mà không có bất kỳ phần đệm nào.
printf "Hex: %2Xn" 15
Bây giờ chúng ta nhận được một giá trị chữ hoa, được in với khoảng trắng ở đầu. Chúng tôi có thể làm printf
điền vào trường bằng các số 0 thay vì khoảng trắng bằng cách đặt một số 0 vào trước hai:
printf "Hex: %02Xn" 15
Bộ chỉ định độ chính xác cho phép bạn đặt số điểm thập phân để đưa vào đầu ra.
printf "Floating point: %08.3fn" 9.243546
Điều này giúp bạn dễ dàng tạo ra các bảng kết quả với đầu ra được căn chỉnh gọn gàng. Lệnh tiếp theo này cũng thể hiện một trong những điều kỳ quặc khác của Bash printf
. Nếu có nhiều đối số hơn số định dạng, các đối số sẽ được đưa vào chuỗi định dạng theo lô cho đến khi tất cả các đối số được sử dụng hết. Kích thước của lô được xử lý tại một thời điểm là số lượng định dạng trong chuỗi định dạng. Trong C, các đối số bổ sung trong printf
các lệnh gọi hàm bị bỏ qua.
printf "Float: %8.3fn" 9.243546 23.665 8.0021
Bạn cũng có thể sử dụng các chỉ số chiều rộng và độ chính xác với các chuỗi. Lệnh này in các chuỗi trong một trường rộng 10 ký tự.
printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3
Theo mặc định, các giá trị được căn phải trong các trường của chúng. Để căn trái chúng, hãy sử dụng dấu trừ “-
“Ngay sau phần trăm”%
” dấu hiệu.
printf "%-10s %d" "coats" 7 "shoes" 22 "Umbrellas" 3
Bộ chỉ định độ chính xác có thể được sử dụng để đặt số lượng ký tự tối đa được in. Chúng tôi đang sử dụng các ký tự dấu hai chấm “:
”Để hiển thị giới hạn của trường chiều rộng. Không phải từ “Ô dù” bị cắt ngắn như thế nào.
printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "coats" "shoes" "Umbrellas"
Thông số chiều rộng thậm chí có thể được chuyển vào dưới dạng tranh luận. Sử dụng dấu hoa thị “*
”Thay vì một chỉ định số và chuyển chiều rộng dưới dạng đối số số nguyên.
printf "%*sn" 20 "Rightmost" 12 "Middle" 5 "leftmost"
Các thủ thuật và kỳ quặc khác
Các chỉ định định dạng bên trong chuỗi định dạng sẽ hoạt động với các giá trị thuộc loại thích hợp, cho dù chúng được cung cấp trên dòng lệnh dưới dạng đối số thông thường hay chúng được tạo dưới dạng đầu ra của một biểu hiện.
Điều này in ra tổng của hai số:
printf "23+32=%dn" $((23+32))
Lệnh này in ra số lượng thư mục trong thư mục làm việc hiện tại:
printf "There are %d directoriesn" $(ls -d */ | wc -l)
Đây printf
lệnh in một chuỗi được trả về từ một lệnh gọi đến một lệnh khác.
printf "Current user: %sn" $(whoami)
Nếu một chỉ định định dạng chuỗi “%s
”Không được cung cấp với một đối số printf
không in gì.
printf "One: %s two: %sn" "Alpha"
Nếu một chỉ định định dạng chuỗi “%s
”Được cung cấp một giá trị số do nhầm lẫn, nó in nó như thể nó là một chuỗi và không phàn nàn. Đừng thử điều này với C printf
—Điều tồi tệ sẽ xảy ra. Chương trình của bạn có thể sẽ gặp sự cố. But the Bash printf
xử lý nó mà không phàn nàn.
printf "One: %s two: %sn" "Alpha" 777
Nếu một chỉ định định dạng số nguyên “%d
”Không nhận được đối số, nó sẽ in bằng không.
printf "Integer: %dn"
Nếu một chỉ định định dạng số nguyên “%d
”Nhận được một đối số chuỗi do nhầm lẫn, Bash sẽ in một thông báo lỗi và printf
sẽ in số không.
printf "Integer: %dn" "Seven"
Các ký hiệu khó hiểu có thể được tạo ra bằng cách sử dụng số Unicode hoặc “điểm mã” của chúng. Chúng được thoát bằng chữ cái “u” theo sau là giá trị Unicode của chúng.
printf "The Euro symbol: u20ACn"
Để bao gồm các chuỗi thoát trong tranh luận chuỗi, bạn phải sử dụng “%b
“Định dạng định dạng trong chuỗi định dạng, không phải”%s
”Định dạng chuỗi.
printf "%s" "u20ACn"
printf "%b" "u20ACn"
Người đầu tiên printf
câu lệnh không xử lý giá trị Unicode và nó không nhận dạng trình tự thoát dòng mới. Thư hai printf
câu lệnh sử dụng “%b
Định dạng ”. Điều này xử lý chính xác ký tự Unicode và một dòng mới được in.
Khóa học cho các khóa học
Đôi khi tất cả những gì bạn cần làm là echo
một số văn bản vào cửa sổ đầu cuối. Nhưng khi bạn cần áp dụng một số định vị và định dạng, printf
là công cụ phù hợp cho công việc.
printf "%b" "Tha-" "tha-" "tha-" "that's all folks.n"