Linux'ta Bash printf Komutu Nasıl Kullanılır
Yayınlanan: 2022-06-25 Bash printf
komutu, echo
komutunun sağladığından daha hassas denetim ve daha fazla biçimlendirme seçeneğiyle bir Linux terminal penceresine yazmanıza olanak tanır. printf
'nin tuhaf tuhaflıkları bile faydalı olabilir.
Bir Terminale Yazma
Bir programla etkileşimin en temel bölümlerinden biridir. Program ekrana bir şey yazıyor ve siz onu okuyorsunuz. Unix'ten türetilen ve Linux tarafından desteklenen komut satırı programlarının mümkün olduğu kadar kısa olduğu göz önüne alındığında bile - çoğu yalnızca bir şeyler ters giderse terminale yazar. Kullanıcıya ne olduğunu veya olmak üzere olduğunu veya şimdi olduğunu söylemek, temel bir programlama ilkesidir.
Bash kabuğu, terminal penceresine metin yazabilen echo
komutuna sahiptir. Dizeye dahil edilmişlerse değişkenleri işleyebilir ve değerlerini görüntüleyebilir ve onu komut dosyalarında veya komut satırında kullanabilirsiniz. Peki printf
neden var? echo
, metin yazma işini kapsamıyor mu? printf
, terminal pencerelerine dize yazmanın basit vanilya eyleminin ötesinde işlevsellik sunar. Çıktıyı büyük bir esneklikle biçimlendirmenize olanak tanır ve başka püf noktaları da vardır.
Bash printf
komutu, C dilinden printf
işlevine göre modellenmiştir, ancak farklılıklar vardır. C biliyorsanız, bu farklılıklara dikkat etmeniz gerekir.
Temel Dizeleri Yazma
Terminale dize yazarken echo
ve printf
nasıl farklılaştığını görelim.
yankı burada bazı kelimeler
printf işte bazı kelimeler
echo
komutu tüm sözcükleri yazdırır, ancak printf
yalnızca ilk sözcüğü yazdırır. Ayrıca printf
tarafından basılan yeni bir satır yok. Çıktı, komut istemine karşı karşıyadır. Ancak, her şeyden önce, printf
tüm kelimeler üzerinde etkili olması için alıntı yapılması gerekir.
yankı burada bazı kelimeler
printf "İşte bazı kelimeler"
Bu daha iyi. Tüm kelimeleri yazdırdık ama hala yeni bir satır alamıyoruz. Bunun nedeni, printf
ile yalnızca bir satır isterseniz yeni bir satır almanızdır. Bu bir acı gibi görünebilir, ancak bir tanesini dahil edip etmemeye karar vermenizi sağlar. printf
yeni bir satır yayınlamasını sağlamak için, dizginize “ \n
” eklemeniz gerekir. Bu, "yeni satır" kaçış dizisidir.
yankı burada bazı kelimeler
printf "işte bazı kelimeler\n"
Bazen yeni bir satır kullanırsınız ve bazen kullanmazsınız. İşte bir printf
ifadesinin yeni bir satır kullandığı ve diğerinin kullanmadığı bir durum.
printf "Nasıl Yapılır" && printf "Geek\n"
İlk printf
yeni bir satır yazdırmadığından, ikinci printf
çıktısı “Nasıl Yapılır”dan hemen sonra ve aynı satırda konumlandırılır. İkinci printf
, yeni bir satır yazdırmak için \n
kullanır. Bu, komut isteminin yazdırılan metnin altındaki satırda görünmesini sağlar.
İLGİLİ: Linux Bash Komut Dosyasında Bir Dosyayı Satır Satır Nasıl İşlenir
Diğer Kaçış Karakterleri
Burada kullanabileceğiniz birkaç kaçış karakteri daha var. “ \n
” öğesini zaten çalışırken gördünüz.
- \n : Yeni bir satıra iner.
- \r : Bir satır başı yazdırır. Bu, çıktı imlecini geçerli satırın başına geri gönderir.
- \t : Bir sekme karakteri yazdırır.
- \v : dikey sekme alanı yazdırır.
- \\ : Bir ters eğik çizgi karakteri yazdırır.
- \” : Bir tırnak karakteri yazdırır.
- \b : Bir geri silme karakteri yazdırır.
Satır başı kaçış karakteri, imleci geçerli satırın başına geri taşır.
printf "Bal tüm kötülüklerin anasıdır\rPara\n"
printf
komutu girdisini soldan sağa doğru işler. Dize, printf
“ \r
” çıkış karakteriyle karşılaşana kadar normal metin olarak yazdırılır. Çıkış imleci geçerli satırın başına geri taşınır.
Dizenin işlenmesi, “ \r
” karakterinin hemen arkasındaki harfle devam eder. Kalanı işlemek, printf
"Bal" kelimesinin üzerine yazarak "Para" yazdırmasına neden olur.
“ "
tırnak işareti dizeleri alıntılamak için kullanılır ve ters eğik çizgi “ \
” karakteri kaçış dizilerini belirtir. Bu karakterleri yazdırmak istiyorsanız, onlardan ters eğik çizgi ile çıkmanız gerekir. Bu, printf
onları değişmez karakterler olarak ele almasını söyler.
printf "Bu bir \tSekmedir, bu bir tırnak işaretidir \" ve bu \\ bir Ters Eğik Çizgidir\n"
Değişkenleri Kullanma
Değişkenleri printf
ile kullanmak, onları echo
ile kullanmaya çok benzer. Bu ortam değişkeni gibi bir değişkeni dahil etmek için, her zamanki gibi onun önüne dolar işareti “ $
” koyun.
printf "Ana dizin: $HOME\n"
İLGİLİ: Bash'de Değişkenlerle Nasıl Çalışılır
Dizeleri Biçimlendir
Biçim dizeleri, çıktının biçimini tanımlayan dizelerdir. Biçim dizesinin üzerinde çalışacağı bağımsız değişkenler olarak metin ve diğer değerleri sağlarsınız.
Biçim dizesi metin, kaçış dizileri ve biçim belirteçleri içerebilir. Format belirteçleri, printf
dizeler, tamsayılar veya karakterler gibi ne tür bir argüman bekleneceğini söyler.
Bunlar en yaygın biçim belirteçleridir. Hepsinin önünde bir yüzde “ %
” işareti bulunur. Yüzde işareti yazdırmak için iki yüzde işaretini birlikte “ %%
” kullanırsınız.
- %s : Bir dize yazdırır.
- %c : Tek bir karakter yazdırır.
- %d : Bir tamsayı yazdırır.
- %f : kayan noktalı bir sayı yazdırır.
- %u : İşaretsiz bir tamsayı yazdırır.
- %o : Sekizlik bir değer yazdırır.
- %x : Bir değeri küçük harfle onaltılık olarak yazdırır.
- %X : Büyük harfle onaltılık bir değer yazdırır.
- %e : Bilimsel gösterimde, küçük harfle bir kayan noktalı sayı yazdırır.
- %E : Bilimsel gösterimde bir kayan noktalı sayıyı büyük harfle yazdırır.
- %% : Yüzde “%” sembolü yazdırır.
printf "Nasıl Yapılır %s\n" "Geek"
printf "%s%s %s\n" "Nasıl" "-Kime" "Geek"
İlk komuttaki biçim dizesi, kendi metnini içerir. “Geek” dizesini argüman olarak printf
. “ %s
” biçim belirteci ile eşleştirilir ve yazdırılır. Biçim dizesi ile bağımsız değişken dizesi arasında yalnızca bir boşluk olduğuna dikkat edin. C'de, onları ayırmak için bir virgül gerekir, ancak printf
Bash versiyonunda boşluk kullanmak yeterlidir.
İkinci biçim dizgisi yalnızca biçim belirteçlerini ve yeni satır kaçış dizisini içerir. Üç dize argümanı, sırayla “ %s
” biçim belirteçlerinin her biri tarafından tüketilir. Yine, C'de, her argüman arasına virgül koymanız gerekir, ancak Bash printf
bunu unutmamıza izin verir.
Farklı türdeki argümanları yazdırmak için uygun format belirtecini kullanmanız yeterlidir. İşte printf
kullanılarak oluşturulmuş hızlı bir sayı dönüştürme rutini. 15 değerini ondalık, sekizlik ve onaltılık gösterimde yazdıracağız.
printf "Aralık: %d\nEkim: %o\nOnaltılı: %x\n" 15 15 15
Örneği daha az karmaşık hale getirmek için bunu biraz kısaltalım.
printf "Onaltılı: %x\n" 15
Çoğumuz onaltılık değerleri büyük harfle ve 0x10'dan küçük değerlerin başında sıfır ile basılmış olarak görmeye alışkınız. Bunu büyük harfli onaltılık biçim belirteci “ %X
” kullanarak ve yüzde işareti “ %
” ile “ X
” karakteri arasına bir genişlik belirteci koyarak başarabiliriz.
Bu, printf
argümanın yazdırılması gereken alanın genişliğini söyler. Alan boşluklarla doldurulur. Bu formatla, iki basamaklı değerler herhangi bir dolgu olmadan yazdırılacaktır.
printf "Onaltılı: %2X\n" 15
Şimdi, baştaki boşlukla basılmış bir büyük harf değeri elde ediyoruz. İkisinin önüne sıfır koyarak alanı boşluk yerine sıfırlarla printf
pad yapabiliriz:
printf "Onaltılı: %02X\n" 15
Kesinlik belirteci, çıktıya dahil edilecek ondalık nokta sayısını ayarlamanıza olanak tanır.
printf "Kayan nokta: %08.3f\n" 9.243546
Bu, düzgün bir şekilde hizalanmış çıktılarla sonuç tabloları oluşturmayı kolaylaştırır. Bu sonraki komut, Bash printf
bir başka tuhaflığını da gösterir. Biçim belirteçlerinden daha fazla argüman varsa, argümanlar tüm argümanlar tükenene kadar gruplar halinde format dizgisine beslenir. Bir seferde işlenen toplu işin boyutu, biçim dizesindeki biçim belirteçlerinin sayısıdır. C'de, printf
işlev çağrılarındaki fazladan argümanlar yok sayılır.
printf "Kayan: %8.3f\n" 9.243546 23.665 8.0021
Genişlik ve kesinlik belirteçlerini dizelerle de kullanabilirsiniz. Bu komut, dizeleri 10 karakter genişliğinde bir alana yazdırır.
printf "%10s %d\n" "mont" 7 "ayakkabılar" 22 "Şemsiyeler" 3
Varsayılan olarak, değerler alanlarında sağa dayalıdır. Onları sola yaslamak için, yüzde “ %
” işaretinin hemen arkasında bir eksi işareti “ -
” kullanın.
printf "%-10s %d" "mont" 7 "ayakkabı" 22 "Şemsiye" 3
Kesinlik belirteci, yazdırılacak maksimum karakter sayısını ayarlamak için kullanılabilir. Genişlik alanının sınırlarını göstermek için iki nokta üst üste karakterleri “ :
” kullanıyoruz. “Şemsiye” kelimesinin nasıl kesildiği değil.
printf ":%10.6s:\n" "mont" "ayakkabılar" "Şemsiyeler"
printf ":%-10.6s:\n" "mont" "ayakkabılar" "Şemsiyeler"
Genişlik belirteci, bir argüman olarak bile iletilebilir. Sayısal belirteç yerine yıldız işareti “ *
” kullanın ve genişliği bir tamsayı argümanı olarak iletin.
printf "%*s\n" 20 "En Sağ" 12 "Orta" 5 "en sol"
Diğer Hileler ve Tuhaflıklar
Biçim dizesinin içindeki biçim belirteçleri, ister komut satırında normal argümanlar olarak sağlanmış olsunlar, isterse bir ifadenin çıktısı olarak oluşturulmuş olsunlar, uygun türdeki değerlerle çalışacaktır.
Bu, iki sayının toplamını yazdırır:
printf "23+32=%d\n" $((23+32))
Bu komut, geçerli çalışma dizinindeki dizin sayısını yazdırır:
printf "%d dizin var\n" $(ls -d */ | wc -l)
Bu printf
komutu, bir çağrıdan başka bir komuta döndürülen bir dize yazdırır.
printf "Mevcut kullanıcı: %s\n" $(whoami)
Bir dize biçimi belirteci “ %s
” bir bağımsız değişkenle birlikte sağlanmazsa, printf
hiçbir şey yazdırmaz.
printf "Bir: %s iki: %s\n" "Alfa"
“ %s
” dizi biçimi belirteci yanlışlıkla sayısal bir değerle sağlanırsa, onu bir dizeymiş gibi yazdırır ve şikayet etmez. Bunu C printf
ile denemeyin - çok kötü şeyler olacak. Programınız muhtemelen çökecektir. Ancak Bash printf
bunu şikayet etmeden hallediyor.
printf "Bir: %s iki: %s\n" "Alfa" 777
Bir tamsayı biçimi belirteci “ %d
” argüman almazsa sıfır yazdırır.
printf "Tamsayı: %d\n"
Bir tamsayı biçimi belirteci “ %d
” yanlışlıkla bir dize argümanı alırsa, Bash bir hata mesajı yazdırır ve printf
sıfır yazdırır.
printf "Tamsayı: %d\n" "Yedi"
Unicode numaraları veya "kod noktaları" kullanılarak garip semboller oluşturulabilir. Bunlar, "u" harfi ve ardından Unicode değerleri kullanılarak kaçar.
printf "Euro sembolü: \u20AC\n"
Argüman dizgilerine kaçış dizileri eklemek için, biçim dizgisinde “ %s
” dizgi biçim belirticisini değil, “ %b
” biçim belirticisini kullanmalısınız.
printf "%s" "\u20AC\n"
printf "%b" "\u20AC\n"
İlk printf
deyimi Unicode değerini işlemez ve yeni satır kaçış dizisini tanımaz. İkinci printf
ifadesi “ %b
” biçim belirtecini kullanır. Bu, Unicode karakterini doğru şekilde işler ve yeni bir satır yazdırılır.
İLGİLİ: ANSI ve Unicode gibi Karakter Kodlamaları Nelerdir ve Nasıl Farklılar?
Kurslar için Atlar
Bazen tek yapmanız gereken terminal penceresine bazı metinleri echo
. Ancak biraz konumlandırma ve biçimlendirme uygulamanız gerektiğinde, printf
bu iş için doğru araçtır.
printf "%b" "Tha-" "tha-" "tha-" "hepsi bu kadar millet.\n"