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 -r
bunu kapatmak için kullanın .
read
karakterleri kelimelere böler $IFS
; IFS
bunu 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= read
yerine 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
echo
süreçler ters eğik çizgiden kaçar. (Bash'da, xpg_echo
seçeneğin ayarlanıp ayarlanmadığına bağlıdır .)
- Birkaç dizge seçenek olarak kabul edilir, örneğin
-n
veya -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 -n
aynı 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ü noclobber
varsayılan olarak kapalıdır.