Cara Menggunakan Perintah Bash printf di Linux

Diterbitkan: 2022-06-25
Terminal Linux dengan latar belakang biru.
fatmawati achmad zaenuri/Shutterstock.com

Perintah Bash printf memungkinkan Anda menulis ke jendela terminal Linux dengan kontrol yang lebih baik dan lebih banyak opsi pemformatan daripada yang disediakan oleh perintah echo . Bahkan kebiasaan aneh printf bisa berguna.

Menulis ke Terminal

Ini adalah salah satu bagian paling dasar dari interaksi dengan sebuah program. Program menulis sesuatu ke layar, dan Anda membacanya. Bahkan dengan mempertimbangkan konvensi program baris perintah yang diturunkan dari Unix dan Linux yang dibuat sesingkat mungkin—banyak yang hanya menulis ke terminal jika terjadi kesalahan. Memberi tahu pengguna apa yang sedang terjadi, atau akan terjadi, atau baru saja terjadi adalah primitif pemrograman yang penting.

Cara Menggunakan Perintah Echo di Linux
TERKAIT Cara Menggunakan Perintah Echo di Linux

Bash shell memiliki perintah echo yang dapat menulis teks ke jendela terminal. Itu dapat menangani variabel dan menampilkan nilainya jika disertakan dalam string, dan Anda dapat menggunakannya dalam skrip atau pada baris perintah. Jadi mengapa printf bahkan ada? Bukankah echo memiliki hal penulisan teks yang tercakup? Nah, printf menawarkan fungsionalitas di luar tindakan penulisan string biasa ke jendela terminal. Ini memungkinkan Anda untuk memformat output dengan fleksibilitas tinggi, dan memiliki trik lain juga.

Perintah Bash printf dimodelkan pada fungsi printf dari bahasa C, tetapi ada perbedaan. Jika Anda tahu C, Anda harus mewaspadai perbedaan tersebut.

Menulis String Dasar

Mari kita lihat bagaimana echo dan printf berbeda ketika mereka menulis string ke terminal.

 gema di sini adalah beberapa kata
 printf di sini ada beberapa kata 

Menggunakan echo dan printf dengan kata-kata yang tidak dikutip

Perintah echo mencetak semua kata tetapi printf hanya mencetak kata pertama. Juga, tidak ada baris baru yang dicetak oleh printf . Outputnya berhadapan langsung dengan command prompt. Tapi, hal pertama yang pertama, agar printf bertindak pada semua kata, mereka perlu dikutip.

 gema di sini adalah beberapa kata
 printf "ini beberapa kata" 

Menggunakan echo dan printf dengan kata-kata yang dikutip

Itu lebih baik. Kami memiliki semua kata yang sedang dicetak tetapi kami masih belum mendapatkan baris baru. Itu karena dengan printf Anda hanya mendapatkan baris baru jika Anda memintanya. Itu mungkin tampak sulit, tetapi itu memungkinkan Anda memutuskan apakah akan memasukkannya atau tidak. Untuk menyebabkan printf mengeluarkan baris baru, Anda harus menyertakan " \n " dalam string Anda. Ini adalah urutan pelarian "baris baru".

 gema di sini adalah beberapa kata
 printf "ini beberapa kata\n" 

Menggunakan echo dan printf dengan kata-kata yang dikutip dan karakter baris baru

Terkadang Anda akan menggunakan baris baru dan terkadang tidak. Inilah kasus di mana satu pernyataan printf menggunakan baris baru dan yang lainnya tidak.

 printf "Caranya" && printf "Geek\n" 

Menggunakan dua printf untuk membuat satu baris teks

Karena printf pertama tidak mencetak baris baru, output dari printf kedua ditempatkan tepat setelah "How-To" dan pada baris yang sama. printf kedua menggunakan \n untuk mencetak baris baru. Ini membuat prompt perintah muncul pada baris di bawah teks yang dicetak.

TERKAIT: Cara Memproses File Baris demi Baris dalam Script Bash Linux

Karakter Escape Lainnya

Berikut adalah beberapa karakter pelarian lainnya yang dapat Anda gunakan. Anda telah melihat “ \n ” beraksi.

  • \n : Pindah ke baris baru.
  • \r : Mencetak carriage return. Ini mengirimkan kursor output kembali ke awal baris saat ini.
  • \t : Mencetak karakter tab.
  • \v : mencetak ruang tab vertikal.
  • \\ : Mencetak karakter garis miring terbalik.
  • \" : Mencetak karakter kutipan.
  • \b : Mencetak karakter spasi mundur.

Karakter carriage return escape memindahkan kursor kembali ke awal baris saat ini .

 printf "Madu adalah akar dari segala kejahatan\rUang\n" 

Menggunakan karakter carriage return untuk kembali ke awal baris

Perintah printf memproses inputnya dari kiri ke kanan. String dicetak sebagai teks biasa hingga printf menemukan karakter escape “ \r ”. Kursor keluaran dipindahkan kembali ke awal baris saat ini.

Pemrosesan string dilanjutkan dengan huruf tepat di belakang karakter “ \r ”. Memproses sisanya menyebabkan printf mencetak "Uang", menimpa kata "Sayang."

Tanda kutip “ " ” digunakan untuk mengutip string, dan karakter garis miring terbalik “ \ ” menunjukkan urutan escape. Jika Anda ingin mencetak karakter ini, Anda perlu menghindarinya dengan garis miring terbalik. Ini memberitahu printf untuk memperlakukannya sebagai karakter literal.

 printf "Ini adalah \tTab, ini adalah tanda kutip \", dan \\ ini adalah Backslash\n" 

Melarikan diri dari karakter sehingga mereka diperlakukan secara harfiah

Menggunakan Variabel

Menggunakan variabel dengan printf sangat mirip dengan menggunakannya dengan echo . Untuk memasukkan variabel, seperti variabel lingkungan ini, awali dengan tanda dolar “ $ ” seperti biasa.

 printf "Direktori beranda: $HOME\n" 

Menggunakan printf dengan variabel lingkungan

TERKAIT: Cara Bekerja dengan Variabel di Bash

Format String

Format string adalah string yang menentukan format output. Anda memberikan teks dan nilai lain sebagai argumen untuk string format yang akan dioperasikan.

String format dapat menyertakan teks, escape sequence, dan format specifier . Penentu format memberi tahu printf jenis argumen apa yang diharapkan, seperti string, bilangan bulat, atau karakter.

Ini adalah penentu format yang paling umum. Semuanya didahului dengan tanda persen “ % ”. Untuk mencetak tanda persen, Anda menggunakan tanda dua persen bersama-sama “ %% .”

  • %s : Mencetak string.
  • %c : Mencetak satu karakter.
  • %d : Mencetak bilangan bulat.
  • %f : mencetak angka floating point.
  • %u : Mencetak bilangan bulat yang tidak ditandatangani.
  • %o : Mencetak nilai dalam oktal.
  • %x : Mencetak nilai dalam heksadesimal, dalam huruf kecil.
  • %X : Mencetak nilai dalam heksadesimal, dalam huruf besar.
  • %e : Mencetak angka floating point dalam notasi ilmiah, dalam huruf kecil.
  • %E : Mencetak angka floating point dalam notasi ilmiah, dalam huruf besar.
  • %% : Mencetak simbol persen “%”.
 printf "Caranya %s\n" "Geek"
 printf "%s%s %s\n" "Bagaimana" "-Ke" "Geek" 

Menampilkan printf menerima argumen "terlalu banyak"

String format pada perintah pertama menyertakan beberapa teksnya sendiri. Kami meneruskan string "Geek" sebagai argumen ke printf . Ini dicocokkan dengan, dan dicetak oleh, penentu format “ %s ”. Perhatikan bahwa hanya ada spasi antara string format dan string argumen. Di C, Anda perlu koma untuk memisahkannya tetapi dengan printf versi Bash menggunakan spasi sudah cukup.

String format kedua hanya berisi penentu format dan urutan escape baris baru. Tiga argumen string digunakan oleh masing-masing penentu format “ %s ” secara bergantian. Sekali lagi, di C, Anda perlu memberi koma di antara setiap argumen tetapi Bash printf memungkinkan kita melupakannya.

Untuk mencetak berbagai jenis argumen, Anda cukup menggunakan penentu format yang sesuai. Inilah rutinitas konversi angka cepat yang dibuat menggunakan printf . Kami akan mencetak nilai 15 dalam notasi desimal, oktal, dan heksadesimal.

 printf "Des: %d\nOkt: %o\nHex: %x\n" 15 15 15 

menggunakan printf untuk mencetak nilai numerik dalam notasi dasar yang berbeda

Mari kita rapikan kembali sedikit sehingga contohnya tidak terlalu berantakan.

 printf "Hex: %x\n" 15 

Mencetak nilai heksadesimal

Sebagian besar dari kita terbiasa melihat nilai heksadesimal dalam huruf besar dan dengan nilai kurang dari 0x10 yang dicetak dengan nol di depan. Kita dapat mencapainya dengan menggunakan penentu format heksadesimal huruf besar " %X " dan menempatkan penentu lebar antara tanda persen " % " dan karakter " X ".

Ini memberitahu printf lebar bidang tempat argumen harus dicetak. Bidang diisi dengan spasi. Dengan format ini, nilai dua digit akan dicetak tanpa bantalan apa pun.

 printf "Hex: %2X\n" 15 

mencetak nilai heksadesimal dalam huruf besar di bidang lebar 2 karakter

Kami sekarang mendapatkan nilai huruf besar, dicetak dengan spasi terdepan. Kita dapat membuat printf pad bidang dengan nol alih-alih spasi dengan meletakkan nol di depan keduanya:

 printf "Hex: %02X\n" 15 

mencetak nilai heksadesimal dalam huruf besar dalam bidang lebar 2 karakter yang diisi dengan nol

Penentu presisi memungkinkan Anda untuk mengatur jumlah titik desimal untuk disertakan dalam output.

 printf "Titik mengambang: %08.3f\n" 9.243546 

Menggunakan pengubah lebar dan presisi dengan angka floating point

Hal ini memudahkan untuk menghasilkan tabel hasil dengan output yang disejajarkan dengan rapi. Perintah berikut ini juga menunjukkan keanehan lain dari Bash printf . Jika ada lebih banyak argumen daripada penentu format, argumen dimasukkan ke dalam string format dalam kumpulan hingga semua argumen habis digunakan. Ukuran batch yang diproses pada suatu waktu adalah jumlah penentu format dalam string format. Di C, argumen tambahan dalam panggilan fungsi printf diabaikan.

 printf "Mengambang: %8.3f\n" 9.243546 23.665 8.0021 

Menggunakan pengubah lebar dan presisi untuk membuat tabel yang rapi

Anda dapat menggunakan penentu lebar dan presisi dengan string juga. Perintah ini mencetak string dalam bidang lebar 10 karakter.

 printf "%10s %d\n" "mantel" 7 "sepatu" 22 "Payung" 3 

Menggunakan pengubah lebar dengan string

Secara default, nilai rata kanan di bidangnya. Untuk membenarkannya ke kiri, gunakan tanda minus “ - ” tepat di belakang tanda persen “ % ”.

 printf "%-10s %d" "mantel" 7 "sepatu" 22 "Payung" 3 

Menggunakan penentu lebar rata kiri dengan string

Penentu presisi dapat digunakan untuk mengatur jumlah maksimum karakter yang dicetak. Kami menggunakan karakter titik dua “ : ” untuk menunjukkan batas bidang lebar. Bukan bagaimana kata "Payung" dipotong.

 printf ":%10.6s:\n" "mantel" "sepatu" "Payung"
 printf ":%-10.6s:\n" "mantel" "sepatu" "Payung" 

Menggunakan pengubah presisi untuk membatasi jumlah karakter yang dicetak dari string

Penentu lebar bahkan dapat diteruskan sebagai argumen . Gunakan tanda bintang “ * ” alih-alih penentu numerik, dan berikan lebar sebagai argumen bilangan bulat.

 printf "%*s\n" 20 "Paling Kanan" 12 "Tengah" 5 "paling kiri" 

Melewati penentu lebar sebagai argumen ke printf

Trik dan Keunikan Lainnya

Penentu format di dalam string format akan bekerja dengan nilai dari tipe yang sesuai, baik yang diberikan pada baris perintah sebagai argumen biasa atau apakah dihasilkan sebagai output dari ekspresi .

Ini mencetak jumlah dua angka:

 printf "23+32=%d\n" $((23+32)) 

Mencetak jumlah dua angka

Perintah ini mencetak jumlah direktori di direktori kerja saat ini:

 printf "Ada %d direktori\n" $(ls -d */ | wc -l) 

Menghitung direktori dengan printf

Perintah printf ini mencetak string yang dikembalikan dari panggilan ke perintah lain.

 printf "Pengguna saat ini: %s\n" $(whoami) 

Mencetak output dari perintah lain

Jika penentu format string “ %s ” tidak disertakan dengan argumen printf tidak mencetak apa pun.

 printf "Satu: %s dua: %s\n" "Alfa" 

Bagaimana printf menangani argumen string yang hilang

Jika penentu format string “ %s ” diberikan dengan nilai numerik secara tidak sengaja, ia mencetaknya seolah-olah itu adalah string dan tidak mengeluh. Jangan coba ini dengan C printf —hal-hal yang sangat buruk akan terjadi. Program Anda mungkin akan macet. Tetapi printf Bash menanganinya tanpa mengeluh.

 printf "Satu: %s dua: %s\n" "Alfa" 777 

Bagaimana printf secara diam-diam menerima bilangan bulat sebagai nilai string

Jika penentu format integer “ %d ” tidak menerima argumen, itu akan mencetak nol.

 printf "Bilangan bulat: %d\n" 

Bagaimana printf menangani argumen integer yang hilang

Jika penentu format integer “ %d ” menerima argumen string secara tidak sengaja, Bash akan mencetak pesan kesalahan dan printf akan mencetak nol.

 printf "Bilangan bulat: %d\n" "Tujuh" 

Bagaimana printf memperlakukan string yang disediakan alih-alih argumen integer

Simbol canggung dapat dibuat dengan menggunakan nomor Unicode atau "titik kode". Ini diloloskan menggunakan huruf "u" diikuti dengan nilai Unicode mereka.

 printf "Simbol Euro: \u20AC\n" 

Mencetak nilai Unicode yang lolos

Untuk menyertakan urutan escape dalam string argumen , Anda harus menggunakan penentu format “ %b ” dalam string format, bukan penentu format string “ %s ”.

 printf "%s" "\u20AC\n"
 printf "%b" "\u20AC\n" 

Menggunakan penspesifikasi format %b untuk menangani urutan pelarian dalam argumen string

Pernyataan printf pertama tidak memproses nilai Unicode dan tidak mengenali urutan escape baris baru. Pernyataan printf kedua menggunakan penentu format “ %b ”. Ini dengan benar menangani karakter Unicode dan baris baru dicetak.

TERKAIT: Apa Pengkodean Karakter Seperti ANSI dan Unicode, dan Bagaimana Perbedaannya?

Kuda untuk Kursus

Terkadang yang perlu Anda lakukan hanyalah echo beberapa teks ke jendela terminal. Tetapi ketika Anda perlu menerapkan beberapa pemosisian dan pemformatan, printf adalah alat yang tepat untuk pekerjaan itu.

 printf "%b" "I-" "I-" "-" "Itu saja.\n"