<Sebelum | Contents [show] | Seterusnya>
printf – Format Dan Cetak Data
Tidak seperti arahan lain dalam bab ini, perintah Printf arahan tidak digunakan untuk talian paip (ia tidak menerima input standard) dan ia juga tidak menemui aplikasi yang kerap secara langsung pada baris arahan (kebanyakannya digunakan dalam skrip). Jadi mengapa ia penting? Kerana ia digunakan secara meluas.
printf (daripada frasa “print formatted”) pada asalnya dibangunkan untuk bahasa pengaturcaraan C dan telah dilaksanakan dalam banyak bahasa pengaturcaraan termasuk shell. Malah, dalam bash, printf adalah terbina.
printf berfungsi seperti ini:
printf “format" hujah
Perintah diberikan rentetan yang mengandungi perihalan format yang kemudiannya digunakan pada senarai argumen. Hasil yang diformatkan dihantar ke output standard. Berikut adalah contoh remeh:
[saya@linuxbox ~]$ printf "Saya memformat rentetan: %s\n" foo
Saya memformat rentetan: foo
[saya@linuxbox ~]$ printf "Saya memformat rentetan: %s\n" foo
Saya memformat rentetan: foo
Rentetan format mungkin mengandungi teks literal (seperti "Saya memformat rentetan:"), urutan melarikan diri (seperti \n, watak baris baharu), dan urutan bermula dengan % watak, yang dipanggil spesifikasi penukaran. Dalam contoh di atas, spesifikasi penukaran %s digunakan untuk memformat rentetan "foo" dan meletakkannya dalam output arahan. Ini sekali lagi:
[saya@linuxbox ~]$ printf "Saya memformat '%s' sebagai rentetan.\n" foo
Saya memformat 'foo' sebagai rentetan.
[saya@linuxbox ~]$ printf "Saya memformat '%s' sebagai rentetan.\n" foo
Saya memformat 'foo' sebagai rentetan.
Seperti yang dapat kita lihat, %s spesifikasi penukaran digantikan dengan rentetan “foo” dalam output arahan. Penukaran s digunakan untuk memformat data rentetan. Terdapat penentu lain untuk jenis data lain. Jadual ini menyenaraikan jenis data yang biasa digunakan:
Jadual 21-4: Penentu Jenis Data cetakan biasa
Penerangan Penentu
Penerangan Penentu
d Formatkan nombor sebagai integer perpuluhan yang ditandatangani.
f Format dan keluarkan nombor titik terapung.
o Formatkan integer sebagai nombor perlapanan.
s Formatkan rentetan.
x Formatkan integer sebagai nombor perenambelasan menggunakan huruf kecil af di mana perlu.
X Sama seperti x tapi guna huruf besar.
% Cetak simbol % literal (iaitu, nyatakan “%%”)
Kami akan menunjukkan kesan setiap penentu penukaran pada rentetan "380":
[saya@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
[saya@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
Memandangkan kami menetapkan enam penentu penukaran, kami juga mesti membekalkan enam hujah untuk
printf untuk diproses. Enam keputusan menunjukkan kesan setiap penentu.
Beberapa komponen pilihan boleh ditambah pada penentu penukaran untuk melaraskan keluarannya. Spesifikasi penukaran yang lengkap mungkin terdiri daripada yang berikut:
%[bendera][lebar][.ketepatan]penukaran_spesifikasi
Berbilang komponen pilihan, apabila digunakan, mesti muncul dalam susunan yang dinyatakan di atas untuk ditafsirkan dengan betul. Berikut ialah huraian setiap satu:
Jadual 21-5: printf Komponen Spesifikasi Penukaran
Penerangan Komponen
Penerangan Komponen
bendera Terdapat lima bendera yang berbeza:
# – Gunakan "format ganti" untuk output. Ini berbeza mengikut jenis data. Untuk penukaran o (nombor oktal), output diawali dengan
0. Untuk penukaran x dan X (nombor heksadesimal), output masing-masing diawali dengan 0x atau 0X.
0–(sifar) Pad output dengan sifar. Ini bermakna medan akan diisi dengan sifar pendahuluan, seperti dalam "000380".
- – (sempang) Jajarkan keluaran ke kiri. Secara lalai, printf menjajarkan output.
' ' – (ruang) Hasilkan ruang utama untuk nombor positif.
+ – (tanda tambah) Tandakan nombor positif. Secara lalai, printf sahaja
menandakan nombor negatif.
lebar Nombor yang menyatakan lebar medan minimum.
.ketepatan Untuk nombor titik terapung, nyatakan bilangan digit ketepatan yang akan dikeluarkan selepas titik perpuluhan. Untuk penukaran rentetan, ketepatan menentukan bilangan aksara untuk dikeluarkan.
Berikut ialah beberapa contoh format yang berbeza dalam tindakan:
Jadual 21-6: Cetak Contoh Spesifikasi Penukaran
Hujah | format | Hasilnya | Nota |
380 | "%d" | 380 | Pemformatan mudah an |
bilangan bulat. | |||
380 | "%#x" | 0x17c | Integer diformatkan sebagai a |
nombor perenambelasan menggunakan | |||
bendera "format ganti". | |||
380 | "% 05d" | 00380 | Integer diformatkan dengan |
sifar pendahuluan (padding) | |||
dan lebar medan minimum | |||
daripada lima aksara. | |||
380 | "%05.5f" | 380.00000 | Nombor diformatkan sebagai a |
nombor titik terapung dengan | |||
padding dan lima perpuluhan | |||
tempat ketepatan. Sejak | |||
minimum yang ditetapkan | |||
lebar medan (5) adalah kurang daripada | |||
lebar sebenar | |||
nombor berformat, yang | |||
padding tiada kesan. | |||
380 | "%010.5f" | 0380.00000 | Dengan meningkatkan |
lebar medan minimum hingga 10 | |||
padding kini kelihatan. | |||
380 | "%+d" | +380 | Bendera + menandakan positif |
nombor. | |||
380 | "%-d" | 380 | Bendera - kiri menjajarkan |
pemformatan. |
abcdefghijk | "% 5s" | abcedfghijk | Rentetan yang diformatkan dengan lebar medan minimum. |
abcdefghijk | "%.5s" | abcde | Dengan menggunakan ketepatan pada rentetan, ia dipotong. |
Sekali lagi, Printf digunakan kebanyakannya dalam skrip di mana ia digunakan untuk memformat data jadual, dan bukannya pada baris arahan secara langsung. Tetapi kami masih boleh menunjukkan cara ia boleh digunakan untuk menyelesaikan pelbagai masalah pemformatan. Mula-mula, mari keluarkan beberapa medan yang dipisahkan oleh aksara tab:
[saya@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
str1 str2 str3
[saya@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
str1 str2 str3
Dengan memasukkan \t (urutan melarikan diri untuk tab), kami mencapai kesan yang diingini. Seterusnya, beberapa nombor dengan pemformatan yang kemas:
[saya@linuxbox ~]$ printf "Barisan: %05d %15.3f Keputusan: %+15d\n" 1071 3.14156295 32589
Talian: 01071 3.142 Keputusan: +32589
[saya@linuxbox ~]$ printf "Barisan: %05d %15.3f Keputusan: %+15d\n" 1071 3.14156295 32589
Talian: 01071 3.142 Keputusan: +32589
Ini menunjukkan kesan lebar medan minimum pada jarak medan. Atau bagaimana pula dengan memformat halaman web kecil:
[saya@linuxbox ~]$ printf " \n\t \n\t\t %s \n
\t \n\t \n\t\t %s \n\t \n \n" "Tajuk Halaman" "Kandungan Halaman"
Tajuk Halaman
Kandungan Halaman
[saya@linuxbox ~]$ printf " \n\t \n\t\t %s \n
\t \n\t \n\t\t %s \n\t \n \n" "Tajuk Halaman" "Kandungan Halaman"
Tajuk Halaman
Kandungan Halaman