Bir metin dosyasını tam anlamıyla okumak için read, çıktıyı iki şekilde işleyen düz kullanmayın :
read\kaçış karakteri olarak yorumlar ; read -rbunu kapatmak için kullanın .
readkarakterleri kelimelere böler $IFS; IFSbunu kapatmak için boş bir dizeye ayarlayın .
Bir metin dosyasını satır satır işlemek için kullanılan genel deyim
while IFS= read -r line; do …
Bu deyimin açıklaması için bkz. Neden while IFS= readyerine bu kadar sık kullanılıyor IFS=; while read..? .
Bir dizeyi tam olarak yazmak için echo, dizeyi iki şekilde işleyen yalnızca düz kullanmayın :
- Bazı mermilerde
echosüreçler ters eğik çizgiden kaçar. (Bash'da, xpg_echoseçeneğin ayarlanıp ayarlanmadığına bağlıdır .)
- Birkaç dizge seçenek olarak kabul edilir, örneğin
-nveya -e(kesin küme kabuğa bağlıdır).
Bir dizgeyi tam anlamıyla yazdırmanın taşınabilir bir yolu vardır printf. (Girişinizin bir seçenek gibi görünmediğini bilmiyorsanız bash'da daha iyi bir yol yoktur echo.) Tam dizeyi yazdırmak için ilk formu ve yeni satır eklemek istiyorsanız ikinci formu kullanın.
printf %s "$line"
printf '%s\n' "$line"
Bu yalnızca metin işlemek için uygundur , çünkü:
- Kabukların çoğu girişteki boş karakterleri boğar.
- Son satırı okuduğunuzda, sonunda bir satırsonu olup olmadığını bilmenin bir yolu yoktur. (Giriş yeni satırla bitmezse bazı eski mermiler daha büyük sorun yaşayabilir.)
Kabuktaki ikili verileri işleyemezsiniz, ancak çoğu unice'deki yardımcı programların modern sürümleri rastgele verilerle başa çıkabilir. Tüm girişleri çıkışa iletmek için tuşunu kullanın cat. Teğet olmak, echo -n ''hiçbir şey yapmanın karmaşık ve taşınabilir olmayan bir yoludur; echo -naynı derecede iyi (veya kabuğa bağlı olmayan) ve :daha basit ve tamamen taşınabilir.
: >| "$file"
cat >>"$file"
veya daha basit,
cat >|"$file"
Bir komut dosyasında, genellikle kullandığınız gerekmez >|çünkü noclobbervarsayılan olarak kapalıdır.