Bourne Shell printf
Komutu Neden %s
Argümanını Tekrar Ediyor?
Shell betikleriyle çalışırken, birçok programcı belirli komut davranışlarından şaşkına döner. Bu durumlardan biri, özellikle dizgi (string) argümanlarla Bourne shell’in printf
fonksiyonunu kullanırken karşımıza çıkar. Hiç printf
ile bir değişkeni göstermeye çalışırken beklenmedik bir çıktı ile karşılaştınız mı? Yalnız değilsiniz! Bunun neden olduğunu ve sorunu nasıl çözebileceğimizi inceleyelim.
Sorunun Analizi
Aşağıdaki basit shell betiğini düşünelim:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Bu betiği çalıştırdığınızda, çıktının basit olacağını varsayabilirsiniz: Hello, George W. Bush
. Ancak, şaşırarak komut satırının şu çıktıyı verdiğini görebilirsiniz:
Hello, George
Hello, W.
Hello, Bush
Burada Ne Oluyor?
Sorun, shell’in değişkeni genişletme biçiminde yatıyor. $NAME
‘i tırnak işareti olmadan kullandığınızda, shell NAME
değişkeninin içeriğini boşluklarla böler ve her bölümü ayrı bir argüman olarak değerlendirir. Bu nedenle, printf
üç argümanla çağrılır: George
, W.
ve Bush
. Bu argümanlar ayrı ayrı işlenir ve bu da beklenmedik davranışa neden olur.
Doğru Yaklaşım
Bu sorunun tamamen önüne geçmek için, değişkeni tırnak işaretleriyle kapsamanız gerekir. İşte betiğinizin düzeltilmiş hali:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Neden Tırnaklar Önemli?
$NAME
‘i tırnak içine aldığınızda, shell’e tüm içeriğin — boşluklar dahil — tek bir argüman olduğunu belirtirsiniz. Bu, boşluk içeren dizgiler için kritik öneme sahiptir, çünkü bunların değişken genişletme sırasında bozulmadan kalmasını sağlar.
Alternatifler: Neden echo
Kullanmayalım?
Neden sadece printf
yerine echo
kullanılmadığını merak edebilirsiniz. İşte farklı bir örnekle her iki komut arasındaki karşılaştırma:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Bu betiği çalıştırmak şu çıktıyı verir:
Filename: C: mp
Bu davranış, echo
kullanırken özellikle ters bölü (backslash) ve kaçış dizileri (escape sequences) ile ortaya çıkabilecek sorunları gösterir. POSIX echo spesifikasyonuna göre: “Yeni uygulamalar echo
yerine printf
kullanmaya teşvik edilmektedir.” Bu tavsiye, printf
‘in çıktı formatlama konusundaki daha öngörülebilir davranışını ve çok yönlülüğünü ifade etmektedir.
Sonuç
Özetlemek gerekirse, shell betiklerinde printf
kullanırken, boşluk veya özel karakterler içerebilecek değişkenlerin etrafında her zaman çift tırnak kullanmayı hatırlamak önemlidir. Bu, çıktınızın beklediğiniz gibi davranmasını sağlar ve can sıkıcı sürprizlerden kaçınmanıza yardımcı olur. Bu küçük ayarlama ile, betiklerinizde temiz ve kontrollü çıktı elde etmek için printf
‘i güvenle kullanabilirsiniz!
Bu gibi en iyi uygulamaları benimseyerek, daha sağlam ve güvenilir shell betikleri yazdığınızı göreceksiniz.